net.socket.setTimeout不适用于async.eachOfSeries

时间:2016-11-18 21:16:26

标签: javascript node.js async.js

我遇到这个问题,如果我无法连接到主机,Nodejs会停止。奇怪的是,当它是一个数组并且端口是静态的时,我使用了async.eachSeries。有谁知道为什么?

client = new net.Socket;
hosts = {'google.com': '443', 'yahoo.com': '80','msn.com': '444'};

client.setTimeout(1000, function () {
    console.log("Timeout has occurred")
});

async.eachOfSeries(hosts, function(port,host,callback) {
    client.connect(port, host, function() {
        console.log('Connected to  ' + host + " on port " + port);
        client.destroy();
        callback();
    });
});

client.on('timeout', function() {
    console.log('client has timed out');
    client.destroy(); // kill client after server's response
});

谢谢,

约翰

1 个答案:

答案 0 :(得分:1)

端口444上的msn.com连接失败,并且从未调用最后一次'回调'(连接成功后) - 这就是节点停止的原因。

检查下面的代码解决了这个问题(通知msn调用现在是第一个,只是超时 - 我觉得最好低估流程。)

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

hosts = { 'msn.com': '444', 'google.com': '443', 'yahoo.com': '80' };

async.eachOfSeries(hosts, function (port, host, callback) {
    client = new net.Socket;

    client.setTimeout(1000, function () {
        console.log("Timeout has occurred")
    });  

    client.connect(port, host, function () {
        console.log('Connected to  ' + host + " on port " + port);
        client.destroy();
        callback();
    }).on('timeout', function () {
        console.log('client has timed out');
        client.destroy();
        callback();
    });
});