Altre risposte sono davvero pazze, come puoi leggere nei documenti di Node su http://nodejs.org/docs/latest/api/process.html#process_event_uncaughtexception
Se qualcuno utilizza altre risposte dichiarate leggi Node Docs:
Si noti che uncaughtException
è un meccanismo molto grezzo per la gestione delle eccezioni e potrebbe essere rimosso in futuro
PM2
Prima di tutto, consiglio vivamente l'installazione PM2
per Node.js
. PM2 è davvero eccezionale nella gestione degli arresti anomali e nel monitoraggio delle app Node nonché nel bilanciamento del carico. PM2 avvia immediatamente l'app Node ogni volta che si arresta in modo anomalo, si arresta per qualsiasi motivo o anche al riavvio del server. Quindi, se un giorno anche dopo aver gestito il nostro codice, l'app si blocca, PM2 può riavviarlo immediatamente. Per ulteriori informazioni, Installazione ed esecuzione di PM2
Ora torniamo alla nostra soluzione per evitare che l'app stessa si blocchi.
Quindi, dopo averlo esaminato, ho finalmente trovato quello che il documento Node stesso suggerisce:
Non utilizzare uncaughtException
, utilizzare domains
con cluster
invece. Se lo usi uncaughtException
, riavvia l'applicazione dopo ogni eccezione non gestita!
DOMINIO con Cluster
Ciò che effettivamente facciamo è inviare una risposta di errore alla richiesta che ha provocato l'errore, lasciando che gli altri finissero il loro tempo normale e smettessero di ascoltare nuove richieste in quel lavoratore.
In questo modo, l'utilizzo del dominio va di pari passo con il modulo cluster, poiché il processo principale può eseguire il fork di un nuovo lavoratore quando un lavoratore rileva un errore. Vedi il codice qui sotto per capire cosa intendo
Utilizzando Domain
e la resilienza di separare il nostro programma in più processi di lavoro utilizzando Cluster
, possiamo reagire in modo più appropriato e gestire gli errori con una sicurezza molto maggiore.
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);
}
Sebbene Domain
sia in attesa di svalutazione e verrà rimosso quando la nuova sostituzione verrà fornita come indicato nella Documentazione di Node
Questo modulo è in attesa di deprecazione. Una volta finalizzata un'API sostitutiva, questo modulo sarà completamente deprecato. Gli utenti che devono assolutamente disporre delle funzionalità fornite dai domini possono fare affidamento su di esso per il momento, ma dovrebbero aspettarsi di dover migrare verso una soluzione diversa in futuro.
Ma fino a quando non verrà introdotta la nuova sostituzione, Domain with Cluster è l'unica buona soluzione suggerita dalla documentazione del nodo.
Per una comprensione Domain
e una Cluster
lettura approfondite
https://nodejs.org/api/domain.html#domain_domain (Stability: 0 - Deprecated
)
https://nodejs.org/api/cluster.html
Grazie a @Stanley Luo per averci condiviso questa meravigliosa spiegazione approfondita su Cluster e Domini
Cluster e domini