为什么从不调用server.close回调?

时间:2015-01-20 19:31:11

标签: node.js express

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

在我的应用程序配置模块(index.js)中,我有错误处理中间件,它检查是否处理了每个错误。如果没有处理错误,则关闭'事件被发出。

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

' close_server'事件处理程序应该:

  1. 关闭服务器,以便不接受新连接。
  2. 完成所有打开的连接后关闭当前进程。
  3. 如果10秒后服务器尚未关闭,请强制关闭该进程。
  4. 提供给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);
            }
        });
    

    仓/万维网

    #!/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);
    });
    

1 个答案:

答案 0 :(得分:2)

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

因此,Chrome最有可能发送Connection: keep-alive请求,这意味着由于效率原因,连接会保持打开一段时间(能够在同一连接上发出多个请求),而curl可能正在使用{{ 1}}在服务器的响应之后立即切断连接。

相关问题