2014-11-03 33 views
0

我有這個簡單的代碼。這必須在每個請求中向我顯示我的錯誤對象({error:'error'})。但它只顯示「[Object object]」。而且 - 調試器從不停止在錯誤處理函數中。 發生了什麼事?NodeJS中的域有些問題

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); 
+2

爲什麼拋出一個對象而不是實際的'Error'實例? – mscdex 2014-11-03 21:44:20

+0

因爲我需要自己的一套屬性。 – 2014-11-03 21:59:39

+0

你也可以在'Error'對象上設置你自己的屬性:'var err = new Error('My error!'); err.foo ='bar';扔錯誤;' – mscdex 2014-11-04 01:16:35

回答

0

的問題是,域捕獲錯誤在調用堆棧底部一路,由於快遞都有自己的錯誤處理代碼,誤差會通過快遞到達域之前捕獲。類似的問題在這裏: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]的方式域的工作是,他們基本上掛接到所有的「異步」的回調,並添加一些信息,記錄誰啓動了異步操作。我不知道他們爲什麼不嘗試捕捉最初的同步塊。

+0

好吧,這聽起來很奇怪,我需要更多的調查。問題在於,在許多其他情況下,expressjs中的類似構造要求以某種方式爲我工作,並且域名完美地捕捉錯誤。我只是沒有設法追蹤這些模式,而當他們不知道問題出在哪裏時。 – 2014-11-04 08:23:16

+0

哇,我剛剛設法發現,一旦代碼被封裝在任何其他回調中,我的域開始捕獲錯誤,不僅是process.nextTicket(),而且甚至是fs.exists()! – 2014-11-04 08:33:30

+0

http://stackoverflow.com/questions/13228649/unable-to-handle-exception-with-node-js-domains-using-express – 2014-11-04 08:47:26