无法捕获 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
全部,
我在 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