2016-02-19 50 views
0

我正在編寫一個節點腳本來發出多個HTTPS請求。第二個調用依賴於uri params的第一個調用。我能夠通過使用節點請求模塊從第一次調用中檢索數據。但堅持第二個調用,因爲我需要從uri param從第一個調用傳遞到第二個url。目標是在第一次調用時獲取所有服務器,並在第二次調用時獲取服務器屬性,直到我遍歷所有用戶。節點嵌套的HTTPS請求

我也嘗試過使用Promise,但當我必須進行第二次調用時卡住了。

請提供工作示例。

這裏是我的代碼:

/********************************************************************** 
DEPENDCIES MODULES 
***********************************************************************/ 
var express = require('express'); 
var request = require('request'); 

var app = express(); 

/************************************************************************* 
SOLUTION 
*************************************************************************/ 
var username = '123', 
    password = 'password*', 
    role = 'Read-Only', 
    url_host = 'https://link.com:1000' 

var url1 = url_host + '/type/PropertySetClasses/SystemObject/Servers/?username=' + username + '&password=' + password + '&role=' + role; 
var url2 = url_host + server_id[i] + '?username=' + username + '&password=' + password + '&role=' + role; 


var auth = "Basic " + new Buffer(username + ':' + password).toString("base64"); 

if ('development' == app.get('env')) { 
    process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; 
} 

request.get(
    { 
     url: url1, 
     headers: { 
     'Authorization': auth, 
     'Content-Type': 'application/json', 
     'Accept': 'application/json' 
     } 
    }, 
    // FETCH ALL SERVERS 
    function (error, response, body) { 
     if(!error && response.statusCode == 200) { 
     var servers = JSON.parse(body); 
     servers = servers.PropertySetClassChildrenResponse.PropertySetClassChildren.PropertySetInstances.Elements; 

     // console.log(JSON.stringify(servers)); 

     var server_id = []; 
     var result = servers.map(function(server) { 
      servers = server.uri; 
      server_id.push(servers); 
     }); 
     // console.log(JSON.stringify(server_id)); 
     } 
    } 

); // END REQUEST 
+0

var url2 = url_host + id_array [i] ...是這個「id_array」是指「server_id」?而你想異步獲取並處理「server_id」,我是對嗎? –

+0

對不起。是的,它指的是server_id。剛剛編輯了代碼。 –

+0

是的,是異步的。目前,我只想完成抓取服務器屬性。這是我的最終目標。 –

回答

0

好,很難確保這個工程就在你的環境,但如果我這樣做,我可能會使用async庫。一旦你的servers的(我假設數組),可以使用異步並行或串行發送多個請求,這取決於你想要得到什麼:

function getServerInfo(server, callback){ 
    var url = // build the URL to the current server, it wasn't clear to me how you were doing that either 

    var options = { 
     url: url, 
     headers: { 
     'Authorization': auth, 
     'Content-Type': 'application/json', 
     'Accept': 'application/json' 
     } 
    } 
    request.get(options, function(e,res,body){ 
     if(e) return callback(e); 
     var json = JSON.parse(body); // probably do a try..catch just in case 
     return callback(null, json); 
    } 

} 

async.map(servers, getServerInfo, function (err, results){ 
    // results here is now an array of the data called back on each getServerInfo call 
}); 
-1
var express = require('express'); 
var request = require('request'); 

var async = require('async'); 
// npm install async 

var app = express(); 

var username = '123', 
    password = 'password*', 
    role = 'Read-Only', 
    url_host = 'https://link.com:1000' 

if ('development' == app.get('env')) { 
    process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; 
} 


function doRequest(params, callback) 
{ 
    request.get(params, function(error, response, body) 
    { 
     if (error || response.statusCode !== 200) 
     { 
      callback({error: error, statusCode: response.statusCode}); 
      return; // [!] break 
     } 

     callback(null, response, body); 
     // export 
    }); 

} 

var url = url_host + '/type/PropertySetClasses/SystemObject/Servers/?username=' + username + '&password=' + password + '&role=' + role; 
var auth = "Basic " + new Buffer(username + ':' + password).toString("base64"); 

var requestParams = { 
    url: url, 
    headers: { 
    'Authorization': auth, 
    'Content-Type': 'application/json', 
    'Accept': 'application/json' 
    } 
}; 

// FETCH SERVER LIST 
doRequest(requestParams, function(err, response, body) 
{ 
    if (err) { 
     throw new Error('unable to fetch server data: ' + JSON.stringify(err)); 
    } 

    var servers = JSON.parse(body); 
     servers = servers.PropertySetClassChildrenResponse.PropertySetClassChildren.PropertySetInstances.Elements; 

    var server_ids = []; 
    var result = servers.map(function(server) 
    { 
     // servers = server.uri; // ??? why 

     /** 
     * merge all "server ids" here somehow 
     */ 
     server_ids.push(server.uri); 
    }); 

    var tasks = []; 
    // async work chain 

    var results = {}; 
    // response obj. 

    server_ids.forEach(function(server_id) 
    { 
     tasks.push(function(next) 
     { 
      var params = JSON.parse(JSON.stringify(requestParams)); 
      // clone | extend main params. 

      params.url = url_host + server_id + '?username=' + username 
       + '&password=' + password + '&role=' + role; 

      doRequest(params, function(err, response, body) 
      { 
       if (!err) 
       { 
        results[server_id] = {response: response, body: body}; 
        // || arguments 
       } 
       else { 
        next([server_id, err]); 
       } 
      }); 
     }); 
    }); 

    // https://github.com/caolan/async#waterfalltasks-callback 
    async.waterfall(tasks, function(err) 
    { 
     if (err) { 
      throw new Error('the server with Id: ' + err[0] + ' failed with error: ' + JSON.stringify(err[1])); 
     } 

     console.log(results); 
     // all done! 
    }); 

    /** 
    // https://github.com/caolan/async#parallel 
    async.parallel(tasks, function(err) 
    { 
     if (err) { 
      throw new Error('the server with Id: ' + err[0] + ' failed with error: ' + JSON.stringify(err[1])); 
     } 

     console.log(results); 
     // all done! 
    }); 
    /**/ 

    /** 
    // https://github.com/caolan/async#parallel 
    async.parallelLimit(tasks, 10, function(err) 
    { 
     if (err) { 
      throw new Error('the server with Id: ' + err[0] + ' failed with error: ' + JSON.stringify(err[1])); 
     } 

     console.log(results); 
     // all done! 
    }); 
    /**/ 
}); 

我不能測試它,但希望你明白這個主意。只需創建一個任務列表並使用「異步」運行即可。

+0

爲什麼投票我不明白。 –