我正在使用connect-domain模块(https://github.com/baryshev/connect-domain)来集中我的Express应用程序中的错误处理。
大多数情况下都有效。但是,由于我不明白的原因,当我在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不再适用于异步抛出的任何错误。 (这包括对fileSystem,timeOuts,数据库连接等的调用)。
如果我将上述内容更改为以下内容......
app.use( connectDomain() );
app.use( express.session({ secret: "secretz" }));
......然后一切都很完美。
RedisStore正在打破Connect-Domain。不幸的是,我需要使用Redis来坚持我的会议。
有关如何解决此问题的任何进一步建议将非常感激。
答案 0 :(得分:2)
我刚试过这段代码:
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
答案 1 :(得分:0)