我正在尝试处理带有回调的nodejs http.Server侦听错误。但是下面的例子会抛出。
如果我将server.listen
函数包装到try ... catch
中,它将起作用,并且回调函数会因错误而被调用。
您能请我启发一下,为什么没有try ... catch
,它不起作用?
有没有更好的方法来捕获侦听错误?
const { createServer } = require('http')
function build(handler, callback) {
const server = createServer((req, res) => handler)
// this will throw RangeError
server.listen(99999, function (err) {
if (err) return callback(err, null)
return callback(null, server)
})
})
编辑:节点版本:10.12.0
答案 0 :(得分:1)
如果提供的函数参数超出预期范围,通常节点会抛出范围错误,您可以像这样尝试/捕获构建函数并在那里处理
function build(handler, callback) {
try {
const server = createServer(handler);
// this will throw RangeError
server.listen(99999, function (err) {
callback(err, server);
});
} catch (e) {
if (e instanceof RangeError) {
// handle your special range rrrors
} else {
// handle all your other errors
}
}
};
您还可以将句柄直接传递给createServer,对于错误回调,您无需返回回调结果
答案 1 :(得分:1)
在节点13上得到答复:
如果您期望回调中出现错误,我认为这是不正确的。我认为在这种情况下,如果有错误,则不会调用回调。
关键是改为侦听要触发的“错误”事件:
async function build(handler, callback) {
const server = createServer((req, res) => handler);
try {
await new Promise((resolve, reject) => {
server.listen(3000, () => {
resolve();
});
server.once('error', (err) => {
console.log(
'There was an error starting the server in the error listener:',
err
);
reject(err);
});
});
return callback(null, server);
} catch (e) {
// Do with the error e as you see fit
console.log('There was an error starting the server:', e);
}
}