如何正确关闭node-express服务器?

时间:2013-01-25 05:34:47

标签: javascript api node.js webserver express

我需要在收到来自/auth/github/callback的回调后关闭服务器 网址。通常 HTTP API 关闭 服务器目前支持server.close([callback]) API函数,但是对于节点快速服务器,我得到了TypeError: Object function app(req, res){ app.handle(req, res); } has no method 'close' 错误。我不知道如何找到解决这个问题的信息 我应该如何关闭快递服务器?

NodeJS配置说明:

$ node --version
v0.8.17
$ npm --version
1.2.0
$ npm view express version
3.0.6

实际应用代码:

var app = express();

// configure Express
app.configure(function() {
    // … configuration
});

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

        setTimeout(function () {
            app.close();
            // TypeError: Object function app(req, res){ app.handle(req, res); } has no method 'close'
        }, 3000)
    }
);

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

此外,我找到了‘nodejs express close…’,但我不确定是否可以将其与我拥有的代码一起使用:var app = express();

4 个答案:

答案 0 :(得分:80)

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

答案 1 :(得分:35)

在express v3中,他们删除了这个功能。

您仍然可以通过分配app.listen()函数的结果并在其上应用close来实现相同的目标:

var server = app.listen(3000);
server.close()

https://github.com/visionmedia/express/issues/1366

答案 2 :(得分:1)

我已经在不同的支持渠道上多次回答了“如何终止HTTP服务器”的变体。不幸的是,我不推荐任何现有的库,因为它们以一种或另一种方式lacking。从那以后,我整理出一个程序包(我认为)可以处理正常的express.js HTTP(S)服务器终止的所有情况。

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

http-terminator的主要好处是:

  • 它没有猴子补丁Node.js API
  • 它会立即破坏所有套接字,而不会附加HTTP请求
  • 它允许对正在进行的HTTP请求的套接字进行适度超时
  • 它可以正确处理HTTPS连接
  • 它通过保持连接状态通过连接设置通知连接服务器正在关闭:close标头
  • 它不会终止Node.js进程

答案 3 :(得分:0)

如果您的Express应用程序中发生任何错误,则必须关闭服务器,然后可以像下面那样进行操作-

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

如果发生任何错误,那么我们的应用程序将收到一个名为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(() => {
    console.log('Http server closed.');
  });
});