Express中间件:捕获域错误

时间:2014-04-16 17:47:58

标签: node.js express

我正试图捕获中间件库中的错误 但它似乎不起作用。
这不应该起作用吗?

我没有让json回来,服务器退出了。

服务器

var express = require('express');
var mw = require('./lib/middleware.js');

var app = express();
app.use('/mw', mw());
app.listen(3000);
console.log('Express started on port 3000');

中间件:

var domain = require('domain');

module.exports = function(devices) {
    return middleware;        
};

var middleware = function(req, res) {

    var d = domain.create();

    d.add(req);
    d.add(res);

    d.on('error', function(err) {
        res.json(500, { error: err })
        res.end();
    });

    d.run(function() {
        throw new Error('some error');
    });
}

2 个答案:

答案 0 :(得分:0)

我在run函数中添加了一个try / catch,因为否则使用了来自express的try / catch。

var domain = require('domain');

module.exports = function() {
    return middleware;        
};

var middleware = function(req, res) {

    var d = domain.create();

    d.add(req);
    d.add(res);

    d.on('error', function(err) {
        handleError(res, err);
    });

    d.run(function() {
        try {
            throw new Error('some error');
        }
        catch(err) {
            handleError(res, err);      
        }

    });
}

var handleError = function(res, err) {
    res.json(500, { error: err.message });
    res.end();    
}

答案 1 :(得分:0)

我也在努力解决这个问题,并找到了另一个有趣的解决方案。

基本上你需要这种中间件:

function(req,res,next){
    var d = domain.create();

    d.on('error',next)

    d.run(function(){
        next();
    })
}

我还创建了npm模块,因此可以轻松附加到项目中:

npmjs - express-async-error