【问题标题】:Something is wrong with domains in NodeJSNodeJS 中的域有问题
【发布时间】:2014-11-03 21:41:42
【问题描述】:

我有这个简单的代码。这必须在每次请求时向我显示我的错误对象 ({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);

【问题讨论】:

  • 你为什么要抛出一个对象而不是一个实际的 Error 实例?
  • 因为我需要自己的一组属性。
  • 您也可以在Error 对象上设置自己的属性:var err = new Error('My error!'); err.foo = 'bar'; throw err;

标签: node.js express


【解决方案1】:

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

我看不出有什么特别好的理由应该采用这种方式,但这就是代码的工作方式 [1](来源:https://github.com/joyent/node/blob/master/lib/domain.js)。可能的解决方法是用您自己的try/catch 包围d.run() 呼叫,或执行类似的操作

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

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

【讨论】:

  • 嗯,这对我来说听起来很奇怪,需要更多调查。关键是,在许多其他情况下,expressjs 请求中的类似结构以某种方式对我有用,并且域可以完美地捕获错误。我只是还没有设法追踪你工作时的模式和他们不工作时的模式,以便了解问题出在哪里。
  • 哇,我刚刚发现,一旦代码被包装在任何其他回调中,我的域就会开始捕获错误,不仅是 process.nextTicket(),甚至 fs.exists() !
猜你喜欢
  • 2013-10-08
  • 2013-11-25
  • 2022-08-16
  • 1970-01-01
  • 2015-08-31
  • 2018-05-25
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
相关资源
最近更新 更多