NodeJS 如何正确关闭节点快速服务器?

zed5wv10  于 2022-11-22  发布在  Node.js
关注(0)|答案(6)|浏览(334)

我 需要 关闭 服务 器 后 , 从 /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(); .

ymdaylpp

ymdaylpp1#

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

falq053o

falq053o2#

在express v3中,他们删除了此功能。
您仍然可以通过赋值app.listen()函数的结果并对其应用close来实现相同的效果:

var server = app.listen(3000);
server.close((err) => {
  console.log('server closed')
  process.exit(err ? 1 : 0)
})

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

2w3rbyxf

2w3rbyxf3#

如果您的Express应用程序中发生任何错误,则必须关闭服务器,您可以按如下所示进行操作-

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

如果出现任何错误,我们的应用程序将获得一个名为SIGTERM的信号。

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);
  });
});
t1qtbnec

t1qtbnec4#

我在不同的node.js支持渠道上多次回答了“如何终止HTTP服务器”的问题。不幸的是,我不能推荐任何现有的库,因为它们在某种程度上是缺乏的。我已经整理了一个包,(我相信)可以处理所有预期的优雅express.js HTTP(S)服务器终止的情况。
https://github.com/gajus/http-terminator
http-terminator的主要优势在于:

  • 它不会monkey-patch Node.js API
  • 它会立即销毁所有没有附加HTTP请求的套接字
  • 它允许对正在进行的HTTP请求的套接字进行适度超时
  • 它可以正确处理HTTPS连接
  • 它通过设置连接来通知使用保持活动的连接服务器正在关闭:封闭式集管
  • 它不会终止Node.js进程
iswrvxsc

iswrvxsc5#

调用server.close即可完成该任务

server.close((err) => {
  console.log('server closed')
  process.exit(err ? 1 : 0)
})

同样,侦听系统(用户)信号并在它们上正常关闭也是很好的,因为您应该侦听SIGTERMSIGINT

const port = process.env.PORT || 5000;
const server = app.listen(port);
console.log(`listening on port:${port}`);
for (let signal of ["SIGTERM", "SIGINT"])
    process.on(signal, () => {
        console.info(`${signal} signal received.`);
        console.log("Closing http server.");
        server.close((err) => {
            console.log("Http server closed.");
            process.exit(err ? 1 : 0);
        });
    });
txu3uszq

txu3uszq6#

老问题了,但是现在Nodev18.2.0引入了server.closeAllConnections()。应该注意的是,当浏览器发送请求Connection: keep-alive时,server.close从不运行它的回调,因为server.close只是阻止服务器接受新连接,它不会关闭旧连接。
在Node v18.2.0之前,我通过等待5秒让服务器关闭来解决这个问题,之后它将强制退出。
这段代码涵盖了这两种情况

process.on('SIGINT', gracefulShutdown)
process.on('SIGTERM', gracefulShutdown)

function gracefulShutdown (signal) {
  if (signal) console.log(`\nReceived signal ${signal}`)
  console.log('Gracefully closing http server')

  // closeAllConnections() is only available from Node v18.02
  if (server.closeAllConnections) server.closeAllConnections()
  else setTimeout(() => process.exit(0), 5000)

  try {
    server.close(function (err) {
      if (err) {
        console.error('There was an error', err)
        process.exit(1)
      } else {
        console.log('http server closed successfully. Exiting!')
        process.exit(0)
      }
    })
  } catch (err) {
    console.error('There was an error', err)
    setTimeout(() => process.exit(1), 500)
  }
}

相关问题