Express.js 4和domain模块:为什么domain不能处理错误?

3

我正在尝试熟悉域模块。因此,我创建了以下学习示例:

var express = require('express')
var domain = require('domain')
var supertest = require('supertest')

describe('some', function() {
    it('some', function(done) {
      var app = express()
      app.use(function(req, res, next) {
        var d = domain.create();
        d.on('error', function(e) {
          console.log('here')
        });
        d.run(next)
      })
      app.use('*', function(req, res) {
        throw new Error()
        res.end()
      })
      supertest(app).get('/').expect(200, done)
    })
})

但是,它并没有像我预期的那样工作。有人能解释一下为什么它从未到达error回调吗?

附加信息:

$ npm list --depth=0
├── express@4.13.4
├── mocha@2.4.5
└── supertest@1.2.0
$ node -v
v6.0.0

附注:我知道它已经被弃用了。但是目前没有替代品,而且有很多项目实际上正在使用它的大型代码库。


https://nodejs.org/api/domain.html 表示“此模块即将被弃用”,因此它将被新API所取代。 - gevorg
你提出什么替代方案? - kharandziuk
是的,可能没有很好的替代方案。当然,这取决于您尝试使用模块解决的问题。您需要它做什么? - gevorg
这有点超出问题的范围。我有一个项目,实际上使用了 domain 模块。 - kharandziuk
1
你使用的 Express 版本是哪个? - gevorg
已将此信息添加到问题中。 - kharandziuk
1个回答

2
原因是在您的域代码之前,Express 4正在进行异常处理。您可以通过在底部添加以下处理程序来确保我是正确的,它会将所有内容包装在try/catch中,如果没有错误处理程序,则打印错误堆栈:
app.use(function (err, req, res, next) {
   console.log(err);
   res.end();
});

其实很有趣,之前没有人注意到我们项目中基于领域的错误处理中间件不起作用 :) - kharandziuk
是的,这种情况可能会发生,它可能适用于之前的 Express 版本 :) - gevorg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接