Mi script nodeNo.js lee las filas de una tabla en la base de datos 1, procesa y escribe las filas en la base de datos 2.¿Cuál es una buena forma de salir de un script node.js después de "se ha hecho todo"
La secuencia de comandos debe salir después de que todo está hecho.
¿Cómo puedo saber si todo está hecho y salir del nodo?
Si tengo una función de devolución de llamada de esta manera:
function exit_node() {
process.exit();
}
(Editar: en el ínterin se hizo evidente que process.exit() podría también ser reemplazado por db.close() - pero esto no es La pregunta es en qué momento exactamente para hacer esto, es decir, cómo y dónde ejecutar esta devolución de llamada.)
Pero no es fácil de adjuntar en algún lugar. Después de la última lectura de db1, no es correcto, porque el procesamiento y la escritura todavía tienen que suceder.
Adjuntarlo a la escritura en db2 no es fácil, porque debe adjuntarse después de la última escritura, pero cada escritura es independiente y no sabe si es la última escritura.
También podría ocurrir teóricamente, que la última escritura haya terminado, pero otra escritura anterior todavía se esté ejecutando.
Edit: Lo siento, puedo ver la explicación de la pregunta no es completa y probablemente confuso, pero algunas personas todavía entendido y hay buenas respuestas a continuación. Continúa leyendo los comentarios y las respuestas, y debería darte una idea completa.
Editar: Podría pensar en algún mecanismo de "bloqueo" del controlador. Las diferentes partes de la secuencia de comandos agregan bloqueadores al controlador para cada "trabajo" abierto y los liberan una vez que el trabajo finaliza, y el controlador sale del script cuando ya no hay bockers presentes. Tal vez async podría ayudar: https://github.com/caolan/async
También me temo que esto explotaría el código y la lógica irracional.
No entiendo su pregunta. El nodo * no * sale cuando todo está hecho. Una vez que haya más llamadas asíncronas en progreso, una vez que haya terminado de procesar el último registro que haya leído y todas sus escrituras se hayan completado, entonces Node saldrá por sí mismo; no tienes que hacer nada especial. –
@JoeWhite Muchos módulos de bases de datos mantendrán abierta una conexión, manteniendo el proceso en funcionamiento. Creo que la pregunta (corrígeme si me equivoco, SHernandez) es cómo saber cuándo se hace el Nodo con todo lo relacionado con la base de datos Async IO, para que pueda saber cuándo cerrar la conexión DB permitiendo que el proceso salga. –
El nodo no saldrá hasta que haya una o más devoluciones de llamada en espera o emisores de eventos activos. Como @BrandonTilley mencionó, algunos de los módulos DB mantienen la conexión DB abierta (eso es EventEmitter), por lo que debe cerrarla una vez que haya terminado con sus consultas. Por lo tanto, en la devolución de llamada de la consulta se escribe algo como 'db.close' (ver documentos), los resultados del proceso y el nodo saldrá solo (sin que usted llame a' process.exit'). – elmigranto