He escrito una pequeña aplicación de back-end con Node Express. Su propósito es recuperar datos de una base de datos MySQL y enviar las filas resultantes como una cadena con formato JSON al cliente solicitante.
app.get(`${baseUrl}/data`, (req, res) => { console.log("Get data"); getDataFromDatabase((error, data) => { if (error) { return res.json({status: CODE_ERROR, content: error}); } else { return res.json({status: CODE_SUCCESS, content: data}); } }); }); Dentro del método getDataFromDatabase() , se envía una declaración SELECT simple a la base de datos y recibe un código de estado más contenido. En caso de éxito, el contenido sería un JSON de filas devueltas, de lo contrario, información sobre el error de MySQL, nuevamente en formato JSON.
Básicamente, este código funciona bien. Hay algunos otros métodos que se construyeron de la misma manera pero que no causan el siguiente problema: después de ejecutar este código en un servidor, descubrí que el proceso siempre muere exactamente ocho horas después de la última llamada del método anterior. El método se puede llamar docenas de veces, el problema ocurre solo después de la inactividad.
Una solución rápida y sucia debido a la falta de tiempo fue simplemente crear un cronjob que elimina el proceso y volver a ejecutar la aplicación cada seis horas. Sin embargo, el nuevo proceso también se cancela ocho horas después de que se haya enviado la última solicitud en el último proceso.
Mientras escribía esta pregunta, revisé nuevamente si había diferencias entre mis métodos. Encontré lo siguiente, aquí un fragmento de getDataFromDatabase() :
if (error) { callback(error, null); } Sin embargo, un método getOtherDataFromDatabase() tiene una palabra clave de return antes de su devolución de llamada:
if(!error) { return callback(null, data); } Entonces, ¿la palabra clave de return hace una diferencia aquí? ¿Hay algún tipo de código asincrónico sin terminar que finaliza después de un tiempo de espera? No tengo excepciones en la salida de mi consola, el proceso muere en silencio.