2013-04-01 88 views
0

我正在使用連接域模塊(https://github.com/baryshev/connect-domain)集中我的Express應用程序中的錯誤處理。Connect-Domain在以下情況下不會捕獲錯誤:

它的大部分工作。但是,由於我不明白的原因,當我在fs.exists檢查中拋出錯誤時,它不捕獲錯誤,而是崩潰節點。

app.get("/anurl/", function(req, res){ 
    ... 
    fs.exists(filename, function(exists) { 
     if (!exists) throw new Error("bah!"); 
     ... 
    }); 
}); 

編輯:

相當多的測試後,我瞭解到,以上是沒有問題的真正原因。

的實際問題與使用的Redis作爲會話存儲:

app.use(connectDomain()); 
app.use(express.session({ 
    secret: "secretz", 
    store: new RedisStore({ client: redis }) 
})); 

使用上面,connectDomain不再適用於已異步引發任何錯誤。 (這包括文件系統調用,超時,數據庫連接等)

如果我改變上述以下...

app.use(connectDomain()); 
app.use(express.session({ secret: "secretz" })); 

...那麼一切都完美的作品。

因此,有關RedisStore的一些事情正在打破Connect-Domain。不幸的是我需要使用Redis來堅持我的會話。

有關如何解決此問題的任何進一步的建議將不勝感激。

回答

2

我只是tryed與此代碼:

var http = require('http'); 
var express = require('express'); 
var connectDomain = require('connect-domain'); 
var fs = require('fs'); 

var app = express(); 
app.use(connectDomain()); 

app.get('/', function (req, res) { 
    fs.exists('test', function (err) { 
     if (!err) throw new Error('bah!'); 
     res.writeHead(200, {'Content-Type': 'text/plain'}); 
     res.end('Hello World\n'); 
    }); 
}); 

app.use(function (err, req, res, next) { 
    res.end(err.message); 
}); 

http.createServer(app).listen(1339, '0.0.0.0'); 

錯誤已成功逮住。

node.js: 0.10.1

connect-domain: 0.5.0

+0

也適用於節點0.8。 – robertklep

+0

感謝您的回覆。你是對的,這是有效的。我誤解了問題的原因,這似乎與使用Redis作爲會話存儲相關。請參閱我上面編輯的問題。 – user1031947