使用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'
)可能会触发多次,而不仅仅是当服务器启动。 如果EADDRINUSE
types的错误被引发并返回到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); }); });
我希望最后一个例子有效,但有没有更好的模式来处理这个问题呢?