使用async.parallel函数回调已经是calleld

时间:2016-07-18 10:12:07

标签: node.js asynchronous

我正在使用Node.js中的核心net模块编写一个简单的端口扫描程序。我的代码中出现'回调已被调用'错误。你能否发现错误的来源?以下是我的代码:

const net = require('net')
const async = require('async')

function findPortStatus(host, port, timeout, cb) {

  const socket = new net.Socket()

  socket.setTimeout(timeout, () => {
    // couldn't establish a connection because of timeout
    socket.destroy()
    return cb(null, null)
  })

  socket.connect(port, host, () => {
    // connection established
    return cb(null, port)
  })

  socket.on('error', (err) => {
    // couldn't establish a connection
    return cb(null, null)
  })
}

const funcs = []

for (let port = 0; port <= 80; port++) {
  funcs.push(function(callback) {
    findPortStatus('192.30.253.112', port, 4000, (err, port) => {
      if (!err) {
        return callback(null, port)
      }
    })
  })
}

async.parallel(funcs, (err, ports) => {
  if (err) {
    console.error(err.message)
  } else {
    for (let port of ports) {
      if (port) {
        console.log(port)
      }
    }
  }
})

2 个答案:

答案 0 :(得分:0)

不确定这是否相关,但是当你调用它时,你真的应该将某些传递给回调。 null,null对调试不是很有用。我建议你的上下文中的timeout事件可能不是错误,但它们是提供信息的。您可以cb(null, 'timeout')cb(null, {state: 'timedOut', port: port})或其他什么来更好地跟踪哪些有效,哪些无效。

但是,实际错误的最可能的候选者是,如果您的套接字在connect事件成功后发出错误或超时事件。连接丢失等。如果您正在寻找的是一个类似“ping”的功能(显然不仅仅是ICMP),那么您应该在获得连接后立即关闭连接和/或删除其他事件侦听器作为连接监听器的处理程序。

最后,节点文档建议您不要直接调用socket.connect(),除非实现自定义套接字(它看起来不像你),而是使用net.createConnection()代替;不确定这对你有帮助,但值得注意。

答案 1 :(得分:0)

看起来成功连接的套接字随后会超时(这是有道理的,因为你连接但后来对连接什么都不做,所以它超时了。)

如果在连接成功后断开连接,那么应该清除错误。