使用Mongoose时,mongodb的连接超时问题

20

我有一个基于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实例进行数据库连接。 在连接方式上是否有任何更改?


连接超时在“null”处让我怀疑正确的端口号没有传递给mongoose的connection.js模块 - 你考虑过这个问题吗? - BenWS
它连接得很好,运行一段时间后也很好。所以我认为连接工作正常,但是在20-30分钟后出现了这个错误。 - Dan
@Dan 我也遇到了同样的问题。如果你能解决它,请告诉我如何解决。 - saeta
你有没有找到解决办法? - PunDefeated
1
更多信息请访问:http://mongoosejs.com/docs/connections.html#options - efkan
2个回答

20

我之前遇到过这个问题。这完全取决于你使用的 mongoosemongodb-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
    }
  }
});

我不知道还要相信什么...


还可以参考这个链接:https://github.com/christkv/mongodb-core/issues/153 最新的mongodb-core设置超时存在问题。 - Daniele

7

我知道这是一个老问题,但是现在的被接受答案包含了已经废弃的代码。为了在Mongoose v5+中设置连接超时,你现在需要将所有选项放在顶层的options对象中,而不是像以前那样嵌套:

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

1000足以防止超时吗?如果将其设置为30,000,是否会有任何副作用?@Mike - Gökhan Polat
@GökhanPolat 这取决于你想要做什么。将其设置为你想要的超时时间即可。我只是举了1000作为例子。 - Mike
socketTimeoutMSuseUnifiedTopology 是独立的。它不是一个已弃用或无效的选项。 - ZachB
@ZachB 写下这个答案已经有一段时间了,但我相信我当时指的是 这个。现在,选项是在顶层声明的,而不是嵌套的。 - Mike
1
@ZachB 我已经编辑了答案以作澄清。 - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接