use*_*569 7 error-handling node.js express
我刚刚开始研究基于express.js的应用程序,该应用程序也使用了pg模块(https://github.com/brianc/node-postgres)
我也花了很多时间,阅读有关节点和表达方法错误处理,正确设计中间件的好处等等.然而,如果没有解决方案,一个反复出现的问题仍然在嗡嗡作响.
说,我有以下路由器方法:
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
});
});
Run Code Online (Sandbox Code Playgroud)
如果我读得正确,这应该是正确的方法.然而,我敢打赌,你也可以认为,一遍又一遍地重写是太多的样板......甚至在同一个路由器方法中,如果我们有多个嵌套回调.
我一直在问自己,集中处理这种情况的最佳方法是什么.我的所有想法都涉及拦截pgClient.query方法.在一个方面,查询方法将简单地抛出错误而不是将其传递给回调.在另一个中,对pgClient.query的调用将在pgClient旁边发送路由器方法.然后截获的查询方法将知道如何处理下一个传递给它的方法.
据我所知,抛出错误并不是真正适合500名处理程序的方法.另一方面,作为pgClient的一个选项,接下来传递,给出如此低级别的关于上面的层的很多知识,这基于我的知识和经验,可以导致耦合,并且也不是很好.
你有什么建议?
Vad*_*hev 11
您可以使用connect-domain中间件.它适用于connect并express基于Doman API.
您需要connect-domain在堆栈中添加中间件作为第一个中间件.就这样.现在,您可以在异步代码中的任何位置抛出错误,它们将使用域中间件处理并传递给表达错误处理程序.
简单的例子:
// 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');
});
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1549 次 |
| 最近记录: |