使用回调处理节点http.Server#listen()错误

时间:2018-10-31 08:56:43

标签: node.js

我正在尝试处理带有回调的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

2 个答案:

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