所有
我在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,....)但我显然遗漏了某些东西在这里。感谢您的投入!
答案 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