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


84

我需要从/auth/github/callback URL回调后关闭服务器。使用通常的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();

Answers:


114

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


4
奇怪,如果我访问某些路线,它没有关闭。
Uday Hiwarale '16

1
@Uday,我也经历过。我发现我的浏览器打开了HTTP1.1持久性连接,因此当我按F5键时,好像服务器没有关闭。如果尝试使用其他浏览器,则会看到服务器套接字未运行。
里克·维德

那是我的错误,我叫app而不是server。拯救了我的一天。非常感谢👍
爱迪生斯宾塞


4

如果您的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.');
  });
});

抱歉,这无关紧要。问题是关于手动关闭服务器,而不是有关错误处理
Vladimir Starkov '19

1

我已经多次回答了“如何终止HTTP服务器”的变体 支持渠道。不幸的是,我无法推荐任何现有的库,因为它们缺少一种或另一种方式。从那以后,我整理了一个软件包(我相信),该软件包正在处理Express.js HTTP(S)服务器终止的所有情况。

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

http-terminator的主要好处是:

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

谢谢您的回答,但是这个问题有7岁了
Vladimir Starkov

5
这仍然是一个有效的问题。
朱斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.