gpt4 book ai didi

node.js - 为什么 server.close 回调从未被调用?

转载 作者:太空宇宙 更新时间:2023-11-03 23:07:56 25 4
gpt4 key购买 nike

如果抛出未处理的错误,我正在尝试“优雅地”关闭 net.Server 实例(使用 app.listen() 创建)。服务器创建发生在我的 bin/www 脚本中。所有错误处理和路由中间件配置都在index.js中定义。

在我的应用程序配置模块(index.js)中,我有错误处理中间件,用于检查每个错误是否得到处理。如果错误未得到处理,则会发出“close”事件。

注意:每个 req 和 res 都包含在一个域中。我正在使用express-domain-middleware中间件模块用于监听每个请求域上的错误事件并将错误路由到我的错误处理。我只是在万一它可能是罪魁祸首时才提到这一点。

“close_server”事件处理程序应该:

  1. 关闭服务器,以便不接受新连接。
  2. 所有打开的连接完成后关闭当前进程。
  3. 如果 10 秒后服务器仍未关闭,则强制关闭进程。

提供给 server.close() 的可选回调似乎从未被调用,我不确定为什么。为了测试这一点,我发出了一个会引发错误的请求。该进程仅在计时器到期(10 秒过去)后关闭。

服务器中是否有什么东西保持打开的连接?为什么 server.close() 回调从未被调用?

谢谢!

更新我正在使用 Chrome 向服务器发出请求。浏览器似乎正在保持打开的连接。如果我使用curl发出请求,它会按预期工作。

查看此issue

index.js

     app.use(function (err, req, res, next) {
if (typeof err.statusCode !== 'undefined') {
if (err.statusCode >= 500) {
Logger.error({error: err});
return next(err);
} else {
Logger.warn({warn: err});
return next(err);
}
} else {
//The error is un-handled and the server needs to go bye, bye
var unhandledError = new UnhandledError(util.format('%s:%s', req.method, req.originalUrl), 'Server shutting down!', err.stack, 500);
Logger.fatal({fatal: unhandledError});
res.status(500).send('Server Error');
app.emit('close_server', unhandledError);
}
});

bin/www

#!/usr/bin/env node
var app = require('../index');
var port = config.applicationPort;

app.set('port', port);
var server = app.listen(app.get('port'));

/*
* Wait for open connections to complete and shut server down.
* After 10 seconds force process to close.
* */
app.on('close_server', function () {
server.close(function () {
console.log('Server Closed.');
process.exit()
});
setTimeout(function () {
console.log('Force Close.');
process.exit()
}, 10 * 1000);
});

最佳答案

server.close()不关闭打开的客户端连接,它仅停止接受连接。

因此,Chrome 很可能使用 Connection: keep-alive 发送请求,这意味着出于效率原因,连接会保持打开状态一段时间(以便能够在同一连接上发出多个请求),而curl 可能使用 Connection: close,在服务器响应后立即断开连接。

关于node.js - 为什么 server.close 回调从未被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28053659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com