我正在使用Node.js,Express,Mongoose和Passport构建一个小型Web应用程序。一切正常,但是如果MongoDB用户数据库不可用,我正在尝试使应用程序正常失败。每次将用户反序列化为会话时,应用程序都会进行数据库调用,因此如果数据库关闭,我就无法做很多事情。我只想向用户显示一般错误页面,并在数据库备份时恢复。
现在,在我的本地实现中,如果我取下MongoDB服务器(只需按CTRL-C)然后尝试重新加载带有身份验证的页面,有时我会得到我的全局错误页面,但主要是应用程序只是挂起而不会产生任何错误或控制台日志(尽管在关键故障点添加了多个console.log()
语句,请参见下文)并继续挂起所有未来的请求。如果我然后重新启动MongoDB服务器,则应用程序无法恢复。
完整的源代码为here,但下面是选择的代码段。
Mongoose连接:
mongoose.connect(mongodbURI, mongodbConnectOptions);
// Log database events to the console for debugging purposes
mongoose.connection.on('open', function () {
console.log("Mongoose open event");
});
mongoose.connection.on('close', function () {
console.log("Mongoose close event");
});
mongoose.connection.on('connected', function () {
console.log("Mongoose connected event");
});
mongoose.connection.on('disconnected', function () {
console.log("Mongoose disconnected event");
});
mongoose.connection.on('error',function (err) {
console.log("Mongoose error event:");
console.log(err)
});
Passport deserializeUser()
致电:
passport.deserializeUser(function(id, done) {
console.log("Attempting to deserialize user")
User.findById(id, function(err, user) {
if (err) console.log("Database error inside deserializeUser()");
done(err, user);
});
});
全局错误处理程序(安装在Express堆栈的末尾):
var errorHandler = function(err, req, res, next) {
console.log("Error caught by Express error handler")
console.log(err);
res.status(500);
res.render('error', { error: err });
}
app.use(errorHandler);
我认为这可能与this question有关,但我特意试图在连接完全丢失时处理这种情况(因为数据库已关闭)。建议?