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

Can't capture duplicate port error in Express

全部,

我在 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,....) 应该能够捕获此错误,但我'我显然在这里遗漏了一些东西。感谢您的输入!

当端口已被使用时,如果服务器上没有错误处理程序,app.listen(80); 将异步抛出异常(您在错误日志中看到的异常)。在这种情况下,服务器是来自 app.listen() 的 return 值,而不是 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