Hay muchos ejemplos de parada elegante para expressjs, ¿cómo puedo lograr lo mismo para koajs?
También me gustaría desconectar las conexiones de la base de datos.
Tengo una conexión de base de datos mongoose y 2 conexiones Oracle db ( https://github.com/oracle/node-oracledb )
Creé un paquete npm http-graceful-shutdown ( https://github.com/sebhildebrandt/http-graceful-shutdown ) hace algún tiempo. Esto funciona perfectamente con http , express y koa . Como desea agregar también sus propias cosas de limpieza, modifiqué el paquete, de modo que ahora puede agregar su propia función de limpieza, que se llamará al apagar. Entonces, básicamente, este paquete maneja todas las cosas de apagado de http además de llamar a su función de limpieza (si se proporciona en las opciones):
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.....') } } );He respondido una variación de "cómo terminar un servidor HTTP" muchas veces en diferentes canales de soporte de node.js. Desafortunadamente, no podría recomendar ninguna de las bibliotecas existentes porque faltan de una forma u otra. Desde entonces, armé un paquete que (creo) está manejando todos los casos que se esperan de una terminación elegante del servidor HTTP.
https://github.com/gajus/http-terminator
El principal beneficio de http-terminator es que:
Uso con 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();Para asegurarse de que las conexiones de Oracle DB estén bien cerradas, puede usar un grupo de conexiones y llamar a pool.close() con un tiempo de drainTime de 0 o mayor. Esto permitirá que la aplicación interrumpa de manera relativamente limpia cualquier operación que esté usando una conexión actualmente. Permite liberar el extremo de la base de datos de las conexiones sin que la base de datos espere a que expire el período de tiempo de espera antes de que se limpie. Incluso con dos conexiones, esta es una solución que consideraría, ya que no importa que el grupo sea pequeño. Es posible que también deba configurar la detección de interrupciones fuera de banda de Oracle Net; consulte Conexiones y alta disponibilidad .