1

假设我有一组 URL,并且我想确保每个 URL 都正常工作,我创建了以下代码。但是,只有数组中的最后一个 URL 正在测试。如何确保每个 url 返回 200 响应代码?需要明确的是,这些都是我正在测试的远程地址,它们指向大小合适的 PDF。

根据@lukas.pukenis 的回复更新。结果相似,实际上只检查了几个文件。

function check(l) {
    console.log(l);

    http.get(l, function(res) {
        if (res.statusCode != 200) {
            console.log(res.statusCode + ' on '+l);
        } else {
            console.log('success on ' + l);
        }
    });
}

for (link in fileLinks) {
  check(fileLinks[link]);
}

此代码输出:

http://somesite.com/somefile1.pdf
http://somesite.com/somefile2.pdf
http://somesite.com/somefile3.pdf
...
all the rest of them
...
http://somesite.com/somefile99.pdf
success on http://somesite.com/somefile1.pdf
success on http://somesite.com/somefile2.pdf
404 on http://somesite.com/somefile5.pdf
success on http://somesite.com/somefile7.pdf
4

2 回答 2

1

这是因为您的循环每次都会重写 l 变量 var l = fileLinks[link];

所以 l 的值是数组的最后一个值。为了保留唯一的l值,您需要将其存储在某个地方。更好 - 功能。像这样:

function check(l) {
  var req = http.get(l, function(res) {
    if (res.statusCode != 200) {
      console.log(res.statusCode + ' on '+l);
    } else {
      console.log('success on ' + l);
    }
  }

  req.on('close', function() {
    console.log('Request done');
  });

for (link in fileLinks) {
  var l = fileLinks[link];
  check(l);
}

拥有一个函数在这里并不神奇。它只是将每个函数调用的本地值保留在内存中,因此每次需要时l都是唯一的。

于 2013-10-24T20:25:04.023 回答
1

for表达式不应与数组一起使用。将for循环替换为以下内容:

fileLinks.forEach(function(item){
  check(item);
});

当执行这么多传出请求时,您可能希望将 增加到maxSockets大于 5(默认值)的值,否则您可能会遇到意外行为。在你之后执行此操作require('http')

http.globalAgent.maxSockets = 150;

此外,当您console.log将回调函数置于外部时,它不会在响应从服务器返回的同时显示。反正都是多余的。这是一个完整的工作示例:

var http = require('http');
var url = require('url');

function check(l) {
  var u = url.parse(l);

  var opts = {
    host: u.host,
    path: u.path,
    agent: false // prevents pooling behavior
  };

    http.get(opts, function(res) {
        if (res.statusCode != 200) {
            console.log(res.statusCode + ' on '+l);
        } else {
            console.log('success on ' + l);
        }
    });
}

fileLinks = ['http://www.google.com','http://www.google.com'];

fileLinks.forEach(function(item){
  check(item);
});
于 2013-10-24T21:20:18.220 回答