无法在Express中捕获重复端口错误

时间:2015-05-23 02:57:24

标签: node.js express error-handling

所有

我在Windows节点上有一个简单的Express Web服务器。如果我试图在与已运行的另一个Express实例相同的端口上启动服务器,我无法弄清楚如何捕获错误。错误中间件不会捕获它而通常的.on(“error”,function()....)也不起作用,并且整个Node应用程序都在轰炸 - 我想优雅地捕获它。

以下是代码:

    var express = require('express');
    var compression = require('compression')
    var app = express();
    var __dirname = ""
    app.use(compression({ threshold: 512 }));
    var oneYear = 86400000 * 365;
    app.enable('etag')
    app.use(express.static(__dirname + '../../HAWebClient', { maxAge: oneYear }));
    app.use(function (err, req, res, next) {
         if (!err) return next();
         console.log('<-------Error Occured ----->');
         res.send(500, JSON.stringify(err, ['stack', 'message']));
    });
    app.on("error", function (err) {
         status("SYSTEM/HTTP", "Error with the web server: " + err);
         // Do stuff with error
    });
    app.listen(80);

我得到了

events.js:72
    throw er; // Unhandled 'error' event
          ^
Error: listen EADDRINUSE
at errnoException (net.js:904:11)
at Server._listen2 (net.js:1042:14)
at listen (net.js:1064:10)
at Server.listen (net.js:1138:5)
at Function.app.listen (C:\Users\deandob\Documents\GitHub\PluginMgr\PluginMgr\node_modules\express\lib\application.js:546:24)
at webSvr (C:\Users\deandob\Documents\GitHub\PluginMgr\PluginMgr\PlugMgr.js:298:9)
at Object.<anonymous> (C:\Users\deandob\Documents\GitHub\PluginMgr\PluginMgr\PlugMgr.js:271:1)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
Press any key to continue...

不想在Node的全局错误处理程序(丢失错误上下文)中捕获此错误 - app.on应该能够捕获此错误(“error,....)但我显然遗漏了某些东西在这里。感谢您的投入!

1 个答案:

答案 0 :(得分:1)

当端口已被使用时,如果您没有在服务器上安装错误处理程序,app.listen(80);将异步抛出异常(您在错误日志中看到的异常)。在这种情况下,服务器是app.listen()的返回值,而不是app对象,这就是您尝试处理错误的原因。

不是让该异常进入将关闭你的应用程序的系统,你可以捕获错误并防止这样的异常:

var server = app.listen(8080);
server.on('error', function(e) {
    console.log(e);
    // put your code here
});

然后,决定在错误处理程序中做什么。我已经在一个示例服务器中测试了这个解决方案,它确实有效。

仅供参考,相关文档在socket对象上:https://nodejs.org/api/net.html#net_server_listen_port_host_backlog_callback