2012-12-29 17 views
7

Kısa bir süre önce pg modülünü (https://github.com/brianc/node-postgres) kullanan bir Express.js tabanlı uygulama üzerinde çalışmaya başladım.Express.js tabanlı bir uygulamada hata işlemeyi merkezileştirme

Ayrıca önemli bir zaman harcadım, düğüm ve ifade yaklaşımı hata işleme hakkında okuma, ara katman yazılımını düzgün bir şekilde tasarlama avantajları vs. gibi. Yine de, yinelenen bir sorun hala bir çözüm olmadan beni rahatsız ediyor. Ben doğru okuduysanız

app.get("/:someThing/:someId", function(req, res, next) { 
    pgClient.query("some SQL query", function(err, data) { 
    if (err) { return next(err); } // some 500 handler will take it 
    if (data.rows.length == 0) { 
     next(); // send it over to a 404 handler 
    } 

    //finally, here we get the chance to do something with the data. 
    //and send it over via res.json or something else 
    }); 
}); 

, bunu yapmak için uygun yolu olmalıdır:

Demek, aşağıdaki yönlendirici yöntemi var. Yine de bahse girerim ki, birden fazla iç içe geçmiş geri çağırma söz konusu olduğunda, aynı yönlendirici yönteminde bile tekrar tekrar yazmanın ve tekrar tekrar yazmanın çok fazla olduğunu kabul edebilirsin.

Böyle bir durumu ele almanın en iyi yolunun merkezi olarak ne olacağını kendime sordum. Tüm fikirlerim pgClient.query yöntemini engellemeyi içerir. Birinde, sorgulama yöntemi basitçe, geri çağrıya iletmek yerine hatayı atacaktır. Bir diğerinde, pgClient.query'ye yapılan çağrı, yönlendirici yöntemini pgClient'in yanına gönderir. Sonra, yakalanan sorgulama yöntemi, bir sonraki iletimle nasıl başa çıkılacağını bilir.

Bildiğim kadarıyla, etrafta hata atmak gerçekten 500 işleyiciye ulaşmanın uygun yolu değil. Diğer taraftan, pgClient seçeneğinin yanı sıra pasif, bilgi ve deneyimime dayanan, üstte yer alan katmanlar hakkında bu kadar düşük düzeyde çok fazla bilgi birikimine neden olur ve bu da çok iyi değildir.

Önerileriniz nelerdir?

+0

'/: Something /: someId'? –

+0

evet, değiştirdim – user1219569

+0

Hayır, tüm 500 istekleri için bir rota düşündüm. –

cevap

11

connect-domain ara yazılımını kullanabilirsiniz. connect ve express ile çalışır ve Doman API'sini temel alır.

Yığında ilk ara katman yazılımı olarak connect-domain ara parçasını eklemeniz gerekir. Bu kadar. Artık, her zaman uyumsuz kodunuzda hatalar atabilir ve bunlar etki alanı ara katman yazılımı ile işlenir ve hata işleyicisini ifade etmek için iletilir.

Basit bir örnek:

// Some async function that can throw error 
var asyncFunction = function(callback) { 
    process.nextTick(function() { 
     if (Math.random() > 0.5) { 
      throw new Error('Some error'); 
     } 
     callback(); 
    }); 
}; 

var express = require('express'); 
var connectDomain = require('connect-domain'); 

var app = express(); 
app.use(connectDomain()); 
// We need to add router middleware before custom error handler 
app.use(app.router); 

// Common error handler (all errors will be passed here) 
app.use(function(err, req, res, next){ 
    console.error(err.stack); 
    res.send(500, 'Something broke!'); 
}); 

app.listen(3131); 

// Simple route 
app.get('/', function(req, res, next) { 
    asyncFunction(function() { 
     res.send(200, 'OK'); 
    }); 
}); 
İlgili konular