使用 mongoose 的 mongodb 连接超时

问题描述 投票:0回答:3

我有一个在 Node、express 和 MongoDB 上运行的 Web 应用程序。我使用 mongoose 作为 ODM。当我使用 mongodb v3.0.1 版本测试我的应用程序时,它运行良好并且没有抛出任何错误。但是当我运行相同的代码 v3.2.10 时,我在一段时间后出现连接超时。

我收到以下错误:

Error: connection timeout at null.<anonymous> (/webapp/node_module/mongoose/lib/drivers/node-mongodb-native/connection.js:186:17)

我使用 mongoose.connect 作为与本地 mongodb 实例的数据库连接。 连接方式有变化吗?

node.js mongodb mongoose
3个回答
20
投票

我不久前也遇到过这个问题。这完全取决于您使用的

mongoose
mongodb-core
的版本。现在,您必须指定以下参数:

mongoose.connect("mongodb://user:password@address/db", {
  server: {
    socketOptions: {
      socketTimeoutMS: 0,
      connectionTimeout: 0
    }
  }
});

然而,就在昨天,正确的参数在哪里

mongoose.connect("mongodb://user:password@address/db", {
  server: {
    socketOptions: {
      socketTimeoutMS: 0,
      connectTimeoutMS: 0
    }
  }
});

我真的不知道该相信什么了..


8
投票

我意识到这是一个老问题,但现在接受的答案包含已弃用的代码。要使用 Mongoose v5+ 设置连接超时,您现在需要将所有选项放在选项对象的顶层,而不是像以前那样嵌套:

mongoose.connect(uri, {
  useUnifiedTopology: true, // For Mongoose 5 only. Remove for Mongoose 6+
  serverSelectionTimeoutMS: 1000, // Defaults to 30000 (30 seconds)
})

0
投票

RTFM ^^ - 获取给定产品最新工作选项的唯一方法是查看相关产品版本的官方文档。

正如今天所说,对于 8.3.x 版本,这里是一个带有官方文档链接的示例,它将默认超时(30 秒)覆盖为 3 秒。

// set 3sec timeout to avoid waiting 30 seconds on misconfiguration:
// warn: this may produce flaky issues on some host with network latency

// doc: https://mongoosejs.com/docs/connections.html#serverselectiontimeoutms
const serverSelectionTimeoutMS = 3000;
// https://mongoosejs.com/docs/api/mongoose.html#Mongoose.prototype.connect()
const socketTimeoutMS = 3000;

const MONGOOSE_CONNECT_OPTIONS = {serverSelectionTimeoutMS, socketTimeoutMS};

// example in use
export const countDocumentsInCollection = async uri => {
    try {
        await mongoose.connect(uri, MONGOOSE_CONNECT_OPTIONS);
        return await myCollection.countDocuments();
    } finally {
        await mongoose.disconnect();
    }
}

文档摘录:

serverSelectionTimeoutMS 选项非常重要:它 控制 MongoDB Node.js 驱动程序尝试重试任何操作的时间长度 发生错误之前的操作。这包括初始连接,例如 wait mongoose.connect(),以及任何发出请求的操作 到 MongoDB,如 save() 或 find()。

[options.socketTimeoutMS=0]
«编号» MongoDB 驱动程序需要多长时间 由于初始后不活动,将在杀死套接字之前等待 连接

© www.soinside.com 2019 - 2024. All rights reserved.