gpt4 book ai didi

node.js - 从 Node (Express) 处理 MongoDB 连接问题

转载 作者:太空宇宙 更新时间:2023-11-03 23:38:17 25 4
gpt4 key购买 nike

我有一个 Express 应用程序,它在启动时连接到 MongoDB 服务器并按需提供请求(我不会断开连接 - 这是一个单线程服务器,因此没有池 - 相当简单的东西)

问题是 MongoDB 服务器可能会在一段时间内不可用(它不在现场),并且虽然 Express 应用程序不会崩溃,但似乎向服务器发出的任何请求都将无限期地运行,直到连接恢复为止!

我想限制这一点(例如,在一段时间后抛出错误),但我似乎无法做到这一点......

我正在使用连接选项“{server: {auto_reconnect: true}}”,这似乎可以确保一旦 MongoDB 服务器重新出现,请求就会完成(没有它,在停机期间发出的请求似乎会永远运行......) - 而且我无权访问客户端代码,所以我无法在那里修复它......

我假设“connectTimeoutMS”或“socketTimeoutMS”的组合允许我在 MongoDB 长时间不可用时终止请求,但我就是无法让它们工作(我已经尝试将它们作为连接选项,将它们传递到 URI 等)

任何打开集合和查找/插入/更新的尝试都会“挂起”,直到 MongoDB 重新出现 - 我已经将其放置超过 30 分钟,所有内容都放在这些位置(并在网络恢复时完成 AOK!)

解决这个问题的最佳方法是什么?我应该专门为每个请求打开一个连接(这并不是真正的性能问题 - 它不是一个大容量应用程序)还是我还缺少其他内容?

更新以添加连接代码

var myDB
var mongodb = require('mongodb')
var uri = // some env vars and stuff
mongodb.MongoClient.connect(uri, {server: {auto_reconnect: true}}, function (err, db) {
myDB = db
})

然后在其他地方使用 myDB 来打开集合 - 并且其中的句柄用于查找/插入等。

如果与数据库的连接中断,myDB.collection() 调用(或在其句柄上查找/插入的调用)将简单地挂起,直到连接恢复 - 我尝试过的任何方法都不会导致它们更快“超时”!?

最佳答案

我假设您使用 mongoose 作为驱动程序。

你会发现这个错误。

var db = require('domain').create();

db.on('error', function(err) {
console.log('DB got a problem');
});

db.run(function() {
mongoose.connect(config, options);
});

或者您可以直接访问

mongoose.connection.readyState

检查您的数据库的语句。

Connection ready state

0 = disconnected

1 = connected

2 = connecting

3 = disconnecting

Each state change emits its associated event name.

http://mongoosejs.com/docs/api.html

关于node.js - 从 Node (Express) 处理 MongoDB 连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28533789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com