使用server.listen()处理错误(例如EADDRINUSE)

时间:2017-07-26 21:58:04

标签: node.js http tcp server

我一直很困惑server.listen()没有采取错误优先回调:

server.listen(port, function(){
   // the first argument is *not* a potential error 
});

一定是一个艰难的设计决定,不要将错误传递给listen()的回调。

似乎我们应该在这里处理错误:

server.on('error', (e) => {
  if (e.code === 'EADDRINUSE') {
    console.log('Address in use, retrying...');
  }
});

但我关心的是server.on('error')可能会多次触发,而不仅仅是服务器启动时。如果引发EADDRINUSE类型错误并将其传递回server.listen()回调,则会更方便。

在某种情况下,我是否可以使用某种模式来传回错误:

exports.startServer = function(data, cb){
   server.listen(data, cb);
   server.once('error', cb);
});

上面的代码是安全的,所以cb只会触发一次吗?

这不安全!因为我们需要删除'错误'监听器,如下所示:

exports.startServer = function(data, cb){
   let onError = function(err){
       cb(err);
    };

   server.once('error', onError);

   server.listen(data, function(){
      server.removeListener('error', onError);
      cb(null);
   });

});

我希望最后一个例子有效,但有没有更好的模式来处理这个问题?

0 个答案:

没有答案