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

我一直困惑/烦恼, server.listen()不采取错误优先callback:

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

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

看来我们应该在这里处理错误:

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

但我担心的是, server.on('error' )可能会触发多次,而不仅仅是当服务器启动。 如果EADDRINUSEtypes的错误被引发并返回到server.listen()callbackEADDRINUSE将会更加方便。

有一些我可以用来传回错误的模式,如下所示:

 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); }); }); 

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