我一直很困惑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);
});
});
我希望最后一个例子有效,但有没有更好的模式来处理这个问题?