使用 connect-mongo 时处理数据库错误
Posted
技术标签:
【中文标题】使用 connect-mongo 时处理数据库错误【英文标题】:Handle database error when using connect-mongo 【发布时间】:2015-01-24 04:46:22 【问题描述】:我有一个相当标准的 connect-mongo 设置
mongoose 在此之前被初始化/连接
app.use(express.session(
secret: "sfdgsdgsdfg",
store: new MongoSessionStore(db: mongoose.connection.db)
));
这很好用。
然而—— 假设我的 mongodb 连接突然断开(在下面的示例中本地停止 mongod) - 下次我尝试打路线时,我的快递应用程序也会崩溃 -
错误:无法连接到 [localhost:27017] 在空。 (/Users/alex/Projects/MyProject/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js:540:74) 在发出 (events.js:106:17) 在空。 (/Users/alex/Projects/MyProject/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection_pool.js:140:15) 在发射(events.js:98:17) 在套接字。 (/Users/alex/Projects/MyProject/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection.js:478:10) 在 Socket.emit (events.js:95:17) 在 net.js:440:14 在 process._tickCallback (node.js:419:13)
有没有办法处理这个错误并(例如)重定向到 /error 路由? (显然不需要会话!)
编辑
所以现在,我正在创建一个单独的 mongoose 连接。
然后我使用on('error'
来监听错误
...这是我卡住的地方- 该进程仍然死亡,因为重新抛出错误不会将其传递给快速错误处理程序......
var sessionDbConnection = mongoose.createConnection(config.sessionDb);
sessionDbConnection.on('error', function(err)
console.log('oops');
throw err; //instead of re-throwing the error, i think i need to pass it to the error handler below??
)
app.use(express.session(
secret: "sfdgsdgsdfg",
store: new MongoSessionStore(db: sessionDbConnection.db)
));
app.use(function(err, req, res, next)
res.render('error', err); //just for testing
);
【问题讨论】:
【参考方案1】:在使用链的末尾设置一个通用错误处理程序...
//function must accept 4 arguments
app.use(function(err, req, res, next)
//use accepts to determin if you should return json, html, image?
//render the appropriate output.
);
此外,让您的处理程序和其他模块接受三个参数 (req, res, next)
以防出错,return next(err)
通常您会希望有选择地使用 .code
属性来匹配您的 http 响应代码与匹配的一个错误。使用4xx
处理输入错误,使用5xx
处理服务器错误等。
另外,如果你想处理一般情况...
process.on('uncaughtException', function(err)
console.error('Caught exception: ' + err);
console.error(err.stack);
//interrogate the error, if it's something you can recover from, let it be.
//if the exception is fatal, exit with prejudice
setTimeout(process.exit.bind(process, 666), 1000); //exit in a second
);
这将处理您的具体情况,但您应该只允许进程继续运行,如果它的某些东西应该自行恢复。
响应您的编辑...当您遇到数据库错误时,您可能有一个全局变量会更改...不幸的是,此错误不一定发生在 http 请求的上下文中。它可能发生在之前/during/after ... 这样你就无法知道了。
如果您使用的客户端会在失败时重新连接,那么这将缓解一些问题。您能做的最好的事情就是跟踪这个变量,为所有请求提供错误。然后重新启动您的流程。
从pm2
到forever
有很多模块可以帮助您解决这个问题。
【讨论】:
我有那个错误处理程序 - 但是它似乎没有被“命中” - 就像错误发生在 express 之外,并且 express 对此无能为力(它是连接-mongo 位) ...事实上,如果我杀死 mongod - 在我刷新页面/访问另一个页面之前,进程就死了(原始帖子中显示了错误) 您的错误处理程序是否在您的 mongo 会话存储模块之后注册?在我看来这是模块中的一个错误。 查看我的编辑 - 我已包含错误处理程序(在模块之后)以上是关于使用 connect-mongo 时处理数据库错误的主要内容,如果未能解决你的问题,请参考以下文章
获取错误语法错误:意外令牌 > 使用 connect-mongo 模块
nodejs的错误Cannot read property 'length' of undefined,怎么解决啊?我是菜鸟