使用 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 ... 这样你就无法知道了。

如果您使用的客户端会在失败时重新连接,那么这将缓解一些问题。您能做的最好的事情就是跟踪这个变量,为所有请求提供错误。然后重新启动您的流程。

pm2forever 有很多模块可以帮助您解决这个问题。

【讨论】:

我有那个错误处理程序 - 但是它似乎没有被“命中” - 就像错误发生在 express 之外,并且 express 对此无能为力(它是连接-mongo 位) ...事实上,如果我杀死 mongod - 在我刷新页面/访问另一个页面之前,进程就死了(原始帖子中显示了错误) 您的错误处理程序是否在您的 mongo 会话存储模块之后注册?在我看来这是模块中的一个错误。 查看我的编辑 - 我已包含错误处理程序(在模块之后)

以上是关于使用 connect-mongo 时处理数据库错误的主要内容,如果未能解决你的问题,请参考以下文章

获取错误语法错误:意外令牌 > 使用 connect-mongo 模块

nodejs的错误Cannot read property 'length' of undefined,怎么解决啊?我是菜鸟

如何在 connect-mongo 中使用会话?

connect-mongo 创建的条目未过期

connect-mongo 创建的条目未过期

connect-mongo模块