Otras respuestas son realmente una locura, ya que puede leer los documentos de Node en http://nodejs.org/docs/latest/api/process.html#process_event_uncaughtexception
Si alguien está usando otras respuestas declaradas, lea Node Docs:
Tenga en cuenta que uncaughtException
es un mecanismo muy burdo para el manejo de excepciones y puede eliminarse en el futuro
PM2
En primer lugar, recomendaría encarecidamente la instalación PM2
de Node.js
. PM2 es realmente excelente para manejar fallas y monitorear aplicaciones de Nodo, así como el equilibrio de carga. PM2 inicia inmediatamente la aplicación Node cada vez que se bloquea, se detiene por cualquier motivo o incluso cuando el servidor se reinicia. Entonces, si algún día, incluso después de administrar nuestro código, la aplicación se bloquea, PM2 puede reiniciarlo de inmediato. Para más información, Instalación y ejecución de PM2
Ahora volviendo a nuestra solución para evitar que la aplicación se bloquee.
Entonces, después de pasar, finalmente se me ocurrió lo que sugiere el documento Node:
No use uncaughtException
, use domains
con en su cluster
lugar. Si lo usa uncaughtException
, reinicie su aplicación después de cada excepción no controlada.
DOMINIO con Cluster
Lo que realmente hacemos es enviar una respuesta de error a la solicitud que activó el error, al tiempo que permite que los demás finalicen en su tiempo normal y dejen de escuchar nuevas solicitudes en ese trabajador.
De esta manera, el uso del dominio va de la mano con el módulo de clúster, ya que el proceso maestro puede bifurcar a un nuevo trabajador cuando un trabajador encuentra un error. Vea el código a continuación para entender a qué me refiero
Al usar Domain
, y la resistencia de separar nuestro programa en múltiples procesos de trabajo Cluster
, podemos reaccionar de manera más apropiada y manejar los errores con mucha mayor seguridad.
var cluster = require('cluster');
var PORT = +process.env.PORT || 1337;
if(cluster.isMaster)
{
cluster.fork();
cluster.fork();
cluster.on('disconnect', function(worker)
{
console.error('disconnect!');
cluster.fork();
});
}
else
{
var domain = require('domain');
var server = require('http').createServer(function(req, res)
{
var d = domain.create();
d.on('error', function(er)
{
//something unexpected occurred
console.error('error', er.stack);
try
{
//make sure we close down within 30 seconds
var killtimer = setTimeout(function()
{
process.exit(1);
}, 30000);
// But don't keep the process open just for that!
killtimer.unref();
//stop taking new requests.
server.close();
//Let the master know we're dead. This will trigger a
//'disconnect' in the cluster master, and then it will fork
//a new worker.
cluster.worker.disconnect();
//send an error to the request that triggered the problem
res.statusCode = 500;
res.setHeader('content-type', 'text/plain');
res.end('Oops, there was a problem!\n');
}
catch (er2)
{
//oh well, not much we can do at this point.
console.error('Error sending 500!', er2.stack);
}
});
//Because req and res were created before this domain existed,
//we need to explicitly add them.
d.add(req);
d.add(res);
//Now run the handler function in the domain.
d.run(function()
{
//You'd put your fancy application logic here.
handleRequest(req, res);
});
});
server.listen(PORT);
}
Aunque Domain
está pendiente de desaprobación y se eliminará a medida que el nuevo reemplazo llegue como se indica en la documentación del nodo
Este módulo está pendiente de desuso. Una vez que se haya finalizado una API de reemplazo, este módulo quedará totalmente en desuso. Los usuarios que deben tener absolutamente la funcionalidad que proporcionan los dominios pueden confiar en ella por el momento, pero deben esperar migrar a una solución diferente en el futuro.
Pero hasta que no se introduzca el nuevo reemplazo, Domain with Cluster es la única buena solución que sugiere Node Documentation.
Para una comprensión profunda Domain
y Cluster
lectura
https://nodejs.org/api/domain.html#domain_domain (Stability: 0 - Deprecated
)
https://nodejs.org/api/cluster.html
Gracias a @Stanley Luo por compartir esta maravillosa explicación detallada sobre Cluster y Dominios.
Cluster y Dominios