'daki kullanım istisnaları Ekspresin oldukça basit bir yönü gibi göründüğü bir şeyin nasıl ele alınacağını anlamakta sorun yaşıyorum. Eşzamansız bir geriçağırımda bir istisna atabilen bir kodum varsa, bu istisnayı yakalayamamın bir yolu yoktur, çünkü try/catch bloğu artık geri arama çalıştırıldığı zaman kapsamda değildir. Bu senaryolarda, tarayıcı sonuçta sunucunun yanıt vermediğini belirten kadar beklemeye devam eder. Bu çok kötü bir kullanıcı deneyimi. Hemen müşteriye 500 hata verebilmeyi tercih ederim. Varsayılan ifade hatası işleyicisi, bu durumu ele almıyor. İşte bazı örnek kod: Yukarıdaki koddaEkspres
var express = require("express");
var app = express();
app.use(app.router);
//express error handler (never called)
app.use(function(err, req, res, next) {
console.log(err);
res.send(500);
});
app.get("/test", function(req, res, next) {
require("fs").readFile("/some/file", function(err, data) {
a.b(); //blow up
});
});
app.listen(8888);
, çizgi a.b(), bir "ReferenceError a tanımlanmadı" atar istisna. Tanımlanmış hata işleyici asla çağrılmaz. Dosya doğru okunduğundan bu durumda fs.readFile() tarafından döndürülen hata nesnesi null olduğuna dikkat edin. Hata, async işleyicinin içindeki koddur.
Node's uncaughtExpception kullanımı hakkında this post okundu, ancak the documentation bu yöntemi kullanmıyor. Kullanmış olsam bile, 500 cevabı kullanıcıya nasıl geri gönderirim? Ekspres yanıt nesnesi artık kullanmam için çevrede değil.
Peki bu senaryoyu nasıl ele alıyorsunuz?
Neden hata, geri aramada atılır? Muhtemelen, MongooseObject içte bir hatayı, onu yakalayacağınız bir noktaya atıyor ve daha sonra geri çağırıyor (err). Şimdi yukarıda gösterilen geri dönüş bir yanıltıcı hata nesnesine sahiptir ve 500 yanıtı gönderebilirsiniz. – Plato
Eğer Mongoose, bir hata ile geri aramıyorsa, duruma düşerse ... hmm Belki bir setTimeout sarıcı yapabilirdiniz. ama tüm hataların derhal geri çağrılmasını beklerdim – Plato
Bu endişe duyduğum Mongoose değil, sadece bir uyumsuzluk işlevini çağırmak için bir yol olarak kullanıyordum. Kendi kodumun aptalca bir şey yapması ve bir istisnanın atılmasına neden olmasından endişeleniyorum. Bunu daha net hale getirmek için örnek kodu güncelleyeceğim. – d512