Yanıtlar:
Http://nodejs.org/docs/latest/api/process.html#process_event_uncaughtexception adresindeki Node'nin kendi belgelerinde okuyabileceğiniz için diğer cevaplar gerçekten delilik.
Birisi belirtilen diğer yanıtları kullanıyorsa Düğüm Dokümanları'nı okuyun:
Bunun
uncaughtException
istisna yönetimi için çok kaba bir mekanizma olduğunu ve gelecekte kaldırılabileceğini unutmayın
PM2
Her şeyden önce, ben çok yükleme öneriyoruz PM2
için Node.js
. PM2, yük dengelemenin yanı sıra kilitlenme ve Düğüm uygulamalarını izleme konusunda gerçekten harika. PM2, Düğüm uygulamasını her kilitlendiğinde, herhangi bir nedenle durduğunda veya sunucu yeniden başlatıldığında hemen başlatır. Yani, bir gün kodumuzu yönettikten sonra bile, uygulama çökerse, PM2 hemen başlatabilir. Daha fazla bilgi için PM2'yi Yükleme ve Çalıştırma
Şimdi uygulamanın çökmesini önlemek için çözümümüze geri dönüyor.
Sonuç olarak, sonunda Düğüm belgesinin kendisinin önerdiği şeyi buldum:
Kullanmayın
uncaughtException
, bunun yerinedomains
ilecluster
kullanın. Eğer kullanımını yaparsanızuncaughtException
, her işlenmeyen istisna sonra uygulamayı yeniden başlatın!
Küme ile DOMAIN
Gerçekte yaptığımız şey, hatayı tetikleyen talebe bir hata yanıtı göndermek ve diğerlerinin normal zamanlarında bitmesini sağlamak ve bu çalışandaki yeni istekleri dinlemeyi bırakmak.
Bu şekilde, ana işlem, bir çalışan bir hatayla karşılaştığında yeni bir çalışanı çatallayabildiğinden, küme modülü ile el ele gider. Ne demek istediğimi anlamak için aşağıdaki koda bakın
Kullanarak Domain
ve programımızı kullanarak birden çok çalışan işlemine ayırmanın esnekliğini kullanarak Cluster
, daha uygun şekilde tepki verebilir ve hataları çok daha güvenli bir şekilde ele alabiliriz.
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);
}
Kullanımdan Domain
kaldırılmayı bekliyor olsa da ve yeni değiştirme Düğüm Belgeleri'nde belirtildiği gibi kaldırılacak olsa da
Bu modül kullanımdan kaldırılmayı bekliyor. Yeni bir API sonlandırıldığında, bu modül tamamen kullanımdan kaldırılacaktır. Etki alanlarının sağladığı işlevselliğe kesinlikle sahip olması gereken kullanıcılar şimdilik buna güvenebilir, ancak gelecekte farklı bir çözüme geçmeleri beklenir.
Ancak yeni değiştirme başlatılıncaya kadar, Küme ile Etki Alanı Düğüm Belgelerinin önerdiği tek iyi çözümdür.
Derinlemesine anlama Domain
ve Cluster
okuma için
https://nodejs.org/api/domain.html#domain_domain (Stability: 0 - Deprecated
)
https://nodejs.org/api/cluster.html
@Stanley Luo'ya Küme ve Etki Alanları hakkındaki bu harika ayrıntılı açıklamayı paylaştığı için teşekkürler
restart your application after every unhandled exception!
2000 kullanıcının video akışı için bir düğüm web sunucusu kullanması ve 1 kullanıcının bir istisnası olması durumunda, yeniden başlatma diğer tüm kullanıcıları kesintiye uğratmaz?
uncaughtException
ve kullanım Domain
ile Cluster
yerine öylesine bir kullanıcı yüzden sadece onun iplik kümesinden kaldırılır ve onun için yeni bir tane oluşturulur bir istisna ile karşı karşıya eğer. Düğüm sunucunuzu da yeniden başlatmanız gerekmez. Diğer taraftan uncaughtException
, kullanıcı herhangi bir sorunla karşılaştığınızda sunucunuzu yeniden başlatmanız gerekir. Bu nedenle Etki Alanı'nı Küme ile kullanın.
domain
tamamen kullanımdan kaldırıldığında ve kaldırıldığında ne yapmalıyız ?
Bu kodu doğru ifadelerimin ve genel bildirimlerimin altına koydum:
process.on('uncaughtException', function (err) {
console.error(err);
console.log("Node NOT Exiting...");
});
benim için çalışıyor. Bu konuda sevmediğim tek şey, sadece bir şeyin çökmesine izin verirsem alacağım kadar bilgi almam.
forever
ya da bir şeyi kullanarak yeniden başlatmaktan daha iyi değil .
Belirtildiği gibi burada bulacağınız error.stack
bu tür hataya neden çizgi sayısı olarak daha eksiksiz bir hata mesajı sunar:
process.on('uncaughtException', function (error) {
console.log(error.stack);
});
Deneyin supervisor
npm install supervisor
supervisor app.js
Veya yükleyebilirsiniz forever
bunun yerine .
Tek yapmanız gereken, sunucunuzu yeniden başlatarak çöktüğünde kurtarmaktır.
forever
çökmekte olan işlemleri incelikle kurtarmak için kod içinde kullanılabilir.
forever
Docs programlı işleme çıkış / hata katı bilgiye sahip.
Try-catch kullanmak yakalanmayan hataları çözebilir, ancak bazı karmaşık durumlarda, zaman uyumsuz işlevi yakalamak gibi işi doğru yapmayacaktır. Düğümde, herhangi bir eşzamansız işlev çağrısının potansiyel bir uygulama kilitlenme işlemi içerebileceğini unutmayın.
Kullanmak uncaughtException
bir çözümdür, ancak verimsiz olarak kabul edilir ve Düğümün gelecekteki sürümlerinde kaldırılması muhtemeldir, bu nedenle buna güvenmeyin.
İdeal çözüm etki alanı kullanmaktır: http://nodejs.org/api/domain.html
Uygulamanızın çalıştığından ve sunucunuzun çökmesine rağmen çalıştığından emin olmak için aşağıdaki adımları kullanın:
çekirdek başına birden çok işlemi çatallamak için düğüm kümesi kullanın. Yani bir süreç ölürse, başka bir süreç otomatik olarak başlatılır. Kontrol et: http://nodejs.org/api/cluster.html
try-catch veya uncaught kullanmak yerine zaman uyumsuz işlemi yakalamak için domain'i kullanın. Try-catch veya yakalanmamış kötü düşünce olduğunu söylemiyorum!
hizmetlerinizi izlemek için sonsuza dek / süpervizör kullanın
düğüm uygulamanızı çalıştırmak için arka plan programı ekleyin: http://upstart.ubuntu.com
Bu yardımcı olur umarım!
PM2 düğüm modülüne bir deneyin, çok tutarlı ve harika belgelere sahip. Yerleşik yük dengeleyicili Node.js uygulamaları için üretim süreç yöneticisi. lütfen bu sorun için uncaughtException özel durumundan kaçının. https://github.com/Unitech/pm2
UncaughtException "çok kaba bir mekanizmadır" (çok doğru) ve alanlar artık kullanımdan kaldırıldı. Ancak yine de (mantıksal) alanlardaki hataları yakalamak için bazı mekanizmalara ihtiyacımız var. Kütüphane:
https://github.com/vacuumlabs/yacol
bunu yapmanıza yardımcı olabilir. Biraz ekstra yazma ile kodunuzun her yerinde güzel bir alan semantiği olabilir!
Restify üzerinde harika çalışıyor:
server.on('uncaughtException', function (req, res, route, err) {
log.info('******* Begin Error *******\n%s\n*******\n%s\n******* End Error *******', route, err.stack);
if (!res.headersSent) {
return res.send(500, {ok: false});
}
res.write('\n');
res.end();
});