Node JS:如何从不同的网站请求多个源代码?

时间:2017-04-08 01:25:40

标签: javascript node.js discord npm-request

我遇到了一个问题,如果我尝试不止一次使用请求,它就不起作用了。我举个例子:

request('https://www.google.com', function (error, response, vBody1) {
    request('https://www.purple.com', function (error, response, vBody2) {
        request('https://www.stackoverflow.com', function (error, response, vBody3) {
            console.log(vBody3);
        });
        console.log(vBody2);
    });
    console.log(vBody1);
});

它读取并输出第一个站点的主体,但不是接下来的两个。 这是另一个例子:

vSites = ['https://www.google.com','https://www.purple.com','https://www.stackoverflow.com'];
for (i = 0; i < vSites.length; i++){
    request(vSites[i], function (error, response, vBody[i]) {
        console.log(vBody[i]);
    });
}

这个看起来更干净,我想要这个版本,但它根本不起作用。我做错了什么?

2 个答案:

答案 0 :(得分:2)

在循环版本中,您不需要vBody变量的索引。

 var request = require('request');
 vSites = ['https://www.google.com','https://www.purple.com','https://www.stackoverflow.com'];
for (i = 0; i < vSites.length; i++){
       request(vSites[i], function (error, response, vBody) {
        console.log(vBody);
    });
   }

此代码在节点v4.3.2上适用于我

答案 1 :(得分:1)

除了来自Michael's reply的正确解决方案之外,请注意for循环并行发送请求。如果您想要做的不仅仅是console.log,那么数据和错误处理可能具有挑战性。

为了更好地处理请求,我建议使用异步控制库,例如asyncbluebird。相比之下,async更容易理解,而bluebird提供更好的代码可读性。

以下是async实施示例:

var async = require('async');
var request = require('request');

var vSites = ['https://www.google.com', 'http://www.purple.com','https://www.stackoverflow.com'];
async.map(
  vSites,
  // `async` will call this function for each `vSite`
  function(vSite, next) {
    // Reuse the code inside your for-loop, but call `next` to pass the error and result to the final callback
    request(vSite, function(err, response, vBody) {
      next(err, vBody);
    });
  },
  // The final callback will be executed when all requests are completed or either of them fails
  function(err, results) {
    console.log(err);
    console.log(results);
  }
);

希望这会有所帮助:)