中间件中的ExpressJS和域错误处理

时间:2014-04-02 21:55:43

标签: node.js express error-handling

我期望绑定到域的中间件将由该域的错误处理程序处理。

在快递中,这并不是真的。

我创建了一个存储库来说明这个问题

https://github.com/rook2pawn/express-domains-issue

var app = express(); 
app.get('/',d.bind(function(req,res,next) {
    throw new Error("error")
}));
var server = http.createServer(app);

不会将错误路由到在d

注册的域错误处理程序

,而

var app = d.bind(function(req,res,next) {
    throw new Error("error")
});
var server = http.createServer(app);

将错误正确地将错误路由到域。

请求对此有任何意见或想法?

2 个答案:

答案 0 :(得分:0)

这只是一个糟糕的例子,因为express在try-catch中包装了中间件。这有效:

app.get('/',d.bind(function(req,res,next) {
    process.nextTick(function () {
      throw new Error("error")
    })
}));

答案 1 :(得分:0)

通过节点js的文档:

“此方法与domain.bind(回调)几乎完全相同。但是,除了捕获抛出的错误之外,它还会拦截作为函数的第一个参数发送的Error对象。”

我写了一个演示代码:

var domain = require('domain');
var fs = require('fs');

var d = domain.create();

require('http').createServer(function(req, res, next) {

d.on('error', function (err) {
    console.log(err);
    res.writeHead(500, "content-type: plain/text");
    res.end("Something missing!");
});


// This is for async
function readFile(filename, cb) {
    fs.readFile(filename, 'utf8', d.bind(function (er, data) {
        return cb(er, data ? JSON.parse(data) : null);
    }));
}
readFile("unknow file");


// This is for sync
(d.bind(function() {
    throw new Error();
}))();

}).listen(1337);

=> d.bind total可以解析所有错误同步和异步到域。这就是定义