2012-08-08 64 views
22

Mutlak bir NodeJS başlatıcısıyım ve Express ve Mongoose ile basit bir REST-Web hizmeti oluşturmak istiyorum.Mongoose ile işlenirken hata oluştu

Mongoose'un hatalarını tek bir merkezde ele almak için en iyi uygulama nedir?

yerde bir veritabanı hatası bir hata mesajı içeren bir HTTP-500-Hata-Page dönmek istiyorum oluşur:

if(error) { 
    res.writeHead(500, {'Content-Type': 'application/json'}); 
    res.write('{error: "' + error + '"}'); 
    res.end(); 
} 

Bir küresel hata dinleyicisi hakkında okumak eski öğretici http://blog-next-stage.learnboost.com/mongoose/ yılında:

Mongoose.addListener('error',function(errObj,scope_of_error)); 

Ancak bu işe yaramıyor gibi görünüyor ve bu dinleyici hakkında official Mongoose documentation içinde bir şey bulamıyorum. Her Mongo talebinden sonra hataları kontrol ettim mi?

cevap

40

Express'i kullanıyorsanız, hatalar genellikle doğrudan rotanızda veya mongoose'un üzerine yerleştirilmiş bir api dahilinde işlenir ve hatayı next adresine iletilir.

app.get('/tickets', function (req, res, next) { 
    PlaneTickets.find({}, function (err, tickets) { 
    if (err) return next(err); 
    // or if no tickets are found maybe 
    if (0 === tickets.length) return next(new NotFoundError)); 
    ... 
    }) 
}) 

NotFoundError

özelleştirilmiş mesajlaşma sağlamak için error handler middleware yılında kokladı edilebilir.

Bazı soyutlama mümkündür, ancak hatayı rota zincirinden aşağı doğru aktarabilmek için next yöntemine erişmeniz gerekir.

PlaneTickets.search(term, next, function (tickets) { 
    // i don't like this b/c it hides whats going on and changes the (err, result) callback convention of node 
}) 

Merkezi mongoose hatalarıyla ilgili olarak, bunların hepsini işlemek için gerçekten tek bir yer değil. Hatalar birkaç farklı düzeylerde ele alınabilir:

connection hataları connection sizin modellerde yayılır tipik sorgular/güncellemeleri için böylece

mongoose.connect(..); 
mongoose.connection.on('error', handler); 

// or if using separate connections 
var conn = mongoose.createConnection(..); 
conn.on('error', handler); 

, kullandığınız/hata geri arama geçirilir kaldırır. Bir geri arama geçemezseniz

PlaneTickets.on('error', handler); // note the loss of access to the `next` method from the request! 
ticket.save(); // no callback passed 

ve dinleme değildir: Hata Modeli tarafından çıkan geri arama geçemezseniz

PlaneTickets.find({..}, function (err, tickets) { 
    if (err) ... 

eğer bunun için dinlerken model seviyesindeki hatalar, connection modellerinde yayınlanacaklardır.

Buradaki önemli işlem, hatayı bir şekilde iletmek için bir şekilde next erişimini kullanmaktır.

+0

Teşekkürler, yardımcı yanıtınız benim için hata işleme konusunda çok şey açıklıyor. – Sonson123

+0

Harika cevap! Özellikle, ExpressJS'in hata işleme ara katmanına doğrudan bağlamak için next() kullanımıyla ilgili öneri. –

+0

Bu, mongoose.connection.on ('error', handler) ile çalışmaz; veya conn.on ('error', handler); Benim için, işleyiciyi, konsol.log() öğesinin ilk argümanı olan ancak sunucu konsolunda hiçbir şey görünmeyen bir işlev olarak tanımladım. – Vadorequest