如何让koajs服务器优雅停止?

问题描述 投票:0回答:5

expressjs 有很多优雅停止的例子,我怎样才能为 koajs 实现同样的效果?

我也想断开数据库连接

我有一个 mongoose 数据库连接和 2 个 oracle 数据库连接 (https://github.com/oracle/node-oracledb)

node.js oracle express mongoose koa
5个回答
6
投票

我不久前创建了一个 npm 包

http-graceful-shutdown
(https://github.com/sebhildebrandt/http-graceful-shutdown)。这与
http
express
koa
完美配合。由于您还想添加自己的清理功能,因此我修改了该包,以便您现在可以添加自己的清理功能,该功能将在关闭时调用。所以基本上这个包处理所有 http 关闭的事情加上调用你的清理函数(如果在选项中提供):

const koa = require('koa');
const gracefulShutdown = require('http-graceful-shutdown');
const app = new koa();

...
server = app.listen(...); // app can be an express OR koa app
...

// your personal cleanup function - this one takes one second to complete
function cleanup() {
  return new Promise((resolve) => {
    console.log('... in cleanup')
    setTimeout(function() {
        console.log('... cleanup finished');
        resolve();
    }, 1000)       
  });
}

// this enables the graceful shutdown with advanced options
gracefulShutdown(server,
    {
        signals: 'SIGINT SIGTERM',
        timeout: 30000,
        development: false,
        onShutdown: cleanup,
        finally: function() {
            console.log('Server gracefulls shutted down.....')
        }
    }
);

2
投票

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

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

http-terminator

的主要好处是:

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

import Koa from 'koa'; import { createHttpTerminator, } from 'http-terminator'; const app = new Koa(); const server = app.listen(); const httpTerminator = createHttpTerminator({ server, }); await httpTerminator.terminate();



1
投票

pool.close()

,其中 
drainTime 为 0 或更大。这将使应用程序相对干净地中断当前正在使用连接的任何操作。它允许释放连接的数据库端,而无需数据库在清理自身之前等待任何超时期限到期。即使有两个连接,这也是我会考虑的解决方案,因为池很小并不重要。您可能还需要设置 Oracle Net 带外中断检测,请参阅
连接和高可用性


1
投票
AbortController

,因此不需要外部库。一个简单的例子:

const app = new Koa();
const server = http.createServer(app.callback());


const controller = new AbortController();
server.listen({
  host: 'localhost',
  port: 80,
  signal: controller.signal
});


// middleware... etc.
app.use(async (ctx) => {
  ctx.body = 'Hello World';
});

// Later, when you want to close the server.
controller.abort();



0
投票
listen

函数中返回的服务器并关闭它。

import Koa from "koa";

export const createServer = async () => {
    const app = new Koa();
    const server = app.listen(3000);
    return {app, server};
}

if (require.main === module) {
    const app = createServer()
    app.server.close()
}

© www.soinside.com 2019 - 2024. All rights reserved.