Neden ilk parametre?
Node.js'nin eşzamansız yapısı nedeniyle, err parametresi olarak ilk parametre deseni, kullanıcı ülkesi Node.js hatalarının işlenmesi için bir kural olarak iyi anlaşılmıştır . Bunun nedeni eşzamansız:
try {
setTimeout(function() {
throw 'something broke' //Some random error
}, 5)
}
catch(e) {
//Will never get caught
}
Bu nedenle, bunun yerine, geri çağrının ilk argümanına sahip olmak, hataları atmaktan başka zaman uyumsuz olarak geçirmenin tek mantıklı yoludur.
Bunu yapmak unhandled exception, sadece göründüğü gibi, uygulamayı şaşkın durumundan çıkarmak için hiçbir şeyin yapılmadığı anlamına gelecektir.
İstisnalar, neden varlar
Bununla birlikte, Node.js'nin neredeyse tüm bölümlerinin olay yayıcıları olduğunu ve bir istisnanın atılmasının, tüm olaylar gibi ele alınabilen düşük seviyeli bir olay olduğunu belirtmek gerekir:
//This won't immediately crash if connection fails
var socket = require("net").createConnection(5000);
socket.on("error", function(err) {
console.error("calm down...", err)
});
Bu , tüm hataları yakalamak ve asla çökmemesi için çok çaba gösterecek bir uygulama yapmak için aşırıya götürülmemelidir . Bu hemen hemen her kullanım durumunda korkunç bir fikirdir, çünkü uygulama durumunda neler olup bittiğine dair herhangi bir fikir olmadan geliştiriciden ayrılacak ve try-catch'de ana sarmalamaya benzer.
Alanlar - etkinlikleri mantıksal olarak gruplama
Uygulamaların devrilmesine neden olan bu istisnalar sorunuyla ilgilenmenin bir parçası olarak, alanlar geliştiricinin örneğin Express.js uygulamasını almasına ve felaket başarısızlığı durumunda bağlantıları makul bir şekilde kapatmaya çalışmasına izin verir.
ES6
ES6'nın jeneratör deseninin hala dene / yakala bloklarıyla toplanabilir eşzamansız olaylar oluşturmasına izin verdiği için bunun tekrar değişeceğinden bahsediyoruz.
Koa (Express.js'nin aynı orijinal yazarı TJ Holowaychuck tarafından yazılmıştır) bunu açıkça yapıyor. ES6 yielddeyimini kullanarak, neredeyse senkronize görünmekle birlikte, normal düğüm asenkronize olarak işlenen bloklar oluşturmak için kullanır :
app.use(function *(next) {
try {
yield next;
}
catch (err) {
this.status = err.status || 500;
this.body = err.message;
this.app.emit('error', err, this);
}
});
app.use(function *(next) {
throw new Error('some error');
})
Bu örnek utanmadan buradan çalınmıştı .