NodeJS中的域有问题

时间:2014-11-03 21:41:43

标签: node.js express

我有这个简单的代码。这必须在每次请求时向我显示我的错误对象({error:'error'})。但它只显示“[Object object]”。 而且 - 调试器永远不会在错误处理函数中停止。 发生了什么事?

var domain = require('domain');
var express = require('express');
var server = express();

server.get('/', function(req, res)
{
    var d = domain.create();
    d.on('error', function(e)
    {
        debugger;
        console.log(JSON.stringify(e));
    }); 

    d.run(function()
    { 
        throw {error:'error'};
        res.send('ok');
    });
});

server.listen(8080);

1 个答案:

答案 0 :(得分:0)

问题是域在调用堆栈的底部一直捕获错误,并且由于express有自己的错误处理代码,错误会在到达域之前被express捕获。类似的问题:Node.js - Domain per Express request, inside another domain

我没有看到任何特别好的理由应该是这样的,但这就是代码的工作方式[1](来源:https://github.com/joyent/node/blob/master/lib/domain.js)。可能的解决方法是使用您自己的d.run()围绕try/catch来电,或者执行类似

的操作
d.run(process.nextTick(function() {
   // do stuff
}));

[1]域的工作方式是它们基本上挂钩了所有的"异步"回调并添加一些记录启动异步操作的人的信息。我不知道他们为什么不尝试/捕捉初始同步块。