【问题标题】:How do I catch node.js/express server errors like EADDRINUSE?如何捕获像 EADDRINUSE 这样的 node.js/express 服务器错误?
【发布时间】:2012-03-21 14:47:31
【问题描述】:

这是我的代码。

if !module.parent
    try
        hons_server.listen config.port
        console.log 'Listening to port ' + config.port
    catch err
        console.error "Couldn't start server: #{String(err)}".red

hons_server 是一个express.js server。我很难理解为什么由于 hons_server.listen() 引发的错误不会被 try/catch 捕获。当我运行我的服务器两次时,我得到了输出:

$ 咖啡 src/server.coffee 监听 9090 端口 节点.js:201 扔 e; // process.nextTick 错误,或第一次滴答时的 'error' 事件 ^ 错误:听 EADDRINUSE 在 errnoException (net.js:632:11) 在 Array.0 (net.js:733:26) 在 EventEmitter._tickCallback (node.js:192:40)

我想知道为什么没有捕获到抛出的错误,以及如何/在哪里可以捕获 EADDRINUSE 错误。

【问题讨论】:

    标签: node.js express error-handling coffeescript


    【解决方案1】:

    接受的解决方案不适用于 nodejs 0.8.22 和 express 3.1.0。

    这成功了:

    process.on('uncaughtException', function(err) {
        if(err.errno === 'EADDRINUSE')
             console.log(...);
        else
             console.log(err);
        process.exit(1);
    });     
    

    另见Node.js Express app handle startup errors

    【讨论】:

      【解决方案2】:

      监听服务器上的error事件

      hons_server.on 'error', (err) ->
          console.log 'there was an error:', err.message
      

      【讨论】:

      • 出于好奇,您是怎么知道的?我知道它不在the documentation 中,而且我找不到任何关于快递服务器支持的事件
      • 基本上,express server 是http Server,它是一个事件发射器。
      • 这仍然适用于最新版本的 Node 吗?请查看下面的答案并在需要时更新您的答案。
      • 它仍然有效。从 express 3.0.0 起,express 对象不再继承自 http.Server,它只是一个插入服务器的函数。 error 事件必须从服务器对象而不是 express 函数中监听。
      • 我希望 express server.listen(function(err){...} 回调支持检查错误,但是这个建议监听像 server.on('error', function(err){...}) 这样的事件非常有效
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      相关资源
      最近更新 更多