是否可以通过domain
或trycatch
see trycatch info here中的express.js包装每个请求?
我正在尝试创建一个'catch all'的各种类型(快速错误处理程序中间件不会捕获异步调用),以确保我错过的任何错误都是通过500发送给用户来处理的。
如果你有一个异步函数调用(例如process.nextTick()),那么它将超出express'错误处理程序的范围,从而完全终止进程。因此,使用快速错误处理程序并不适用于所有情况。
答案 0 :(得分:8)
Express已经有错误处理程序实现。它从connect继承。要使用它,您需要将其添加为最后一个中间件点(最后一次app.use(...)调用)。例如:
var express = require('express')
, app = express();
app.use(app.router);
app.use(express.errorHandler());
// app.get(...), app.post(...), app.listen(...), etc.
如果您想使用简单的500响应代码处理所有错误,可以使用自己的函数替换express.errorHandler()
。在这种情况下,您的代码将如下所示:
var express = require('express')
, app = express();
app.use(app.router);
app.use(function(err, req, res, next){
if (!err) return next();
res.send(500);
});
// app.get(...), app.post(...), app.listen(...), etc.
有关这种方式的更多信息可以在代码<{3}}中注明
<强>更新强>:
当然,您可以为每个请求使用域名。您可以单独包装每个请求,也可以使用包装来处理所有异常。代码如下:
var express = require('express')
, http = require('http')
, app = express()
, domain = require('domain');
//app.use(app.router);
app.use(function(req, res, next){
var d = domain.create();
d.on('error', function(er) {
console.log('error, but oh well', er.message);
res.send(500);
});
// explicitly add req and res
d.add(req);
d.add(res);
d.run(function() {
app.router(req, res, next);
});
});
app.get('/', function(req,res){
process.nextTick(function(){
throw new Error('Check Error');
});
});
http.createServer(app).listen(3000, function(){
console.log('Express server listening on port 3000');
});
!!但是!! 从不在制作中使用它。其原因在于JS如何投入工作。它肯定会导致您的应用程序泄漏,并使其更加不稳定。您可以使用此类错误处理来实现自定义关闭算法(例如,关闭已打开的连接)。有关正确使用域名的更多信息,请参阅express error example。
要监控泄漏,您可以使用documentation中的技术。
更新2 :
我只是不能离开这个没完成。 trycatch
代码:
var express = require('express')
, http = require('http')
, app = express()
, domain = require('domain')
, trycatch = require('trycatch');
//app.use(app.router);
app.use(function(req, res, next){
trycatch(function(){
app.router(req, res, next);
}, function(er){
console.log(er.message);
res.send(500);
});
});
app.get('/', function(req,res){
process.nextTick(function(){
throw new Error('Check Error');
});
});
http.createServer(app).listen(3000, function(){
console.log('Express server listening on port 3000');
});
我查看了trycatch
的来源,没有任何魔法。它仍然是泄漏的原因。 trycatch
幕后有domain
。