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

Node JS: How do I request multiple source codes from different websites?

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

request('https://www.google.com', function (error, response, vBody1) {
    request('https://www.purple.com', function (error, response, vBody2) {
        request('https://www.whosebug.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.whosebug.com'];
for (i = 0; i < vSites.length; i++){
    request(vSites[i], function (error, response, vBody[i]) {
        console.log(vBody[i]);
    });
}

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

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

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

此代码在节点 v4.3.2 上对我来说工作正常

除了 中的正确解决方案外,请注意 for 循环并行发送请求。如果您想做的不仅仅是 console.log.

,数据和错误处理可能具有挑战性

为了更好地处理请求,我建议使用异步控制库,例如 async or bluebird. In comparison, async is easier to understand while bluebird 以提供更好的代码可读性。

下面是一个例子async实现:

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

var vSites = ['https://www.google.com', 'http://www.purple.com','https://www.whosebug.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);
  }
);

希望这对您有所帮助:)