使用Express,Mongoose和Passport处理数据库连接错误

时间:2016-10-30 17:27:53

标签: node.js mongodb express mongoose passport.js

我正在使用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有关,但我特意试图在连接完全丢失时处理这种情况(因为数据库已关闭)。建议?

0 个答案:

没有答案