101
4

4 回答 4

133

app.listen()返回http.Server。您应该close()在该实例上调用,而不是在app实例上调用。

前任。

app.get(
    '/auth/github/callback',
    passport.authenticate('github', { failureRedirect: '/login' }),
    function(req, res) {
        res.redirect('/');

        setTimeout(function () {
            server.close();
            // ^^^^^^^^^^^
        }, 3000)
    }
);

var server = app.listen('http://localhost:5000/');

您可以检查来源:/node_modules/express/lib/application.js

于 2013-01-25T05:59:06.850 回答
57
于 2014-02-12T20:52:53.880 回答
11

如果您的快速应用程序中发生任何错误,那么您必须关闭服务器,您可以执行以下操作 -

var app = express();
var server = app.listen(process.env.PORT || 5000)

如果发生任何错误,那么我们的应用程序将收到一个名为SIGTERM. 您可以在此处阅读更多 SIGTERM - https://www.gnu.org/software/libc/manual/html_node/Termination-Signals.html

process.on('SIGTERM', () => {
  console.info('SIGTERM signal received.');
  console.log('Closing http server.');
  server.close((err) => {
    console.log('Http server closed.');
    process.exit(err ? 1 : 0);
  });
});
于 2019-07-01T12:05:06.640 回答
4

支持渠道上多次回答了“如何终止 HTTP 服务器”的变体。不幸的是,我不能推荐任何现有的库,因为它们以一种或另一种方式缺乏。从那以后,我已经组合了一个包,(我相信)它可以处理所有预期的优雅 express.js HTTP(S) 服务器终止的情况。

https://github.com/gajus/http-terminator

http-terminator的主要好处是:

  • 它没有猴子补丁 Node.js API
  • 它会立即销毁所有没有附加 HTTP 请求的套接字
  • 它允许对正在进行的 HTTP 请求的套接字进行优雅的超时
  • 它正确处理 HTTPS 连接
  • 它通过设置连接来通知连接使用保持活动服务器正在关闭:关闭标头
  • 它不会终止 Node.js 进程
于 2020-01-20T03:15:51.467 回答