2014-04-16 58 views
0

我試圖捕獲中間件庫中的錯誤。
但它似乎並不奏效。
不應該這樣做嗎?快遞中間件:發現域錯誤

我沒有讓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'); 
    }); 
} 
+0

的http://計算器。 com/questions/22823887/expressjs-and-domain-error-handling-in-middleware/22824448#22824448 – vkurchatkin

+0

express does try/catch,但爲什麼域沒有先處理錯誤?比Try/Catch不會被達到? – r03

+0

,因爲它已被捕獲。我開始明白 – r03

回答

0

我加了一個try/catch run函數裏面,否則使用來自快遞的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();  
} 
0

我也一直在努力,發現了另一個有趣的解決方案。

基本上你需要這種中間件:

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

    d.on('error',next) 

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

我還創建了新公共管理模塊,所以可以很容易地連接到項目:

npmjs - express-async-error