MongoDB 连接错误:MongoTimeoutError:服务器选择在 30000 毫秒后超时

Arv*_*mar 18 mongoose node.js mongodb-atlas

我正在尝试创建一个完整的应用程序,阅读以下教程:

https://medium.com/javascript-in-plain-english/full-stack-mongodb-react-node-js-express-js-in-one-simple-app-6cc8ed6de274

我遵循了所有步骤,然后尝试运行:

node server.js
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

MongoDB 连接错误:MongoTimeoutError:服务器选择在 Timeout._onTimeout (C:\RND\fullstack_app\backend\node_modules\mongodb\lib\core\sdam\server_selection.js:308:9) 在 30000 毫秒后超时(内部/ timers.js:531:17) at processTimers (internal/timers.js:475:7) { name: 'MongoTimeoutError', reason: Error: connect ETIMEDOUT 99.80.11.208:27017 at TCPConnectWrap.afterConnect [as oncomplete] (net. js:1128:14) { name: 'MongoNetworkError', [Symbol(mongoErrorContextSymbol)]: {} }, [Symbol(mongoErrorContextSymbol)]: {} } (node:42892) UnhandledPromiseRejectionWarning: MongoTimeoutError: 服务器选择在 30000 毫秒后超时在 Timeout._onTimeout (C:\RND\fullstack_app\backend\node_modules\mongodb\lib\core\sdam\server_selection.js:308:9) 在 listOnTimeout (internal/timers.js:531:17) 在 processTimers (internal/timers.js:475:7)

我在 server.js 上的代码如下:

const mongoose = require('mongoose');
const router = express.Router();

// this is our MongoDB database
const dbRoute =
    'mongodb+srv://user:<password>@cluster0-3zrv8.mongodb.net/test?retryWrites=true&w=majority';

mongoose.Promise = global.Promise;

// connects our back end code with the database
mongoose.connect(dbRoute, 
    {   useNewUrlParser: true,
        useUnifiedTopology: true
    });

let db = mongoose.connection;

db.once('open', () => console.log('connected to the database'));
Run Code Online (Sandbox Code Playgroud)

有什么建议?

jav*_*301 56

我在这上面浪费了一整天,因为白名单建议不是我的问题(我在 docker compose 中运行,选项设置正确,每次我的客户端尝试连接时,--bind_ip我都可以在 mongo 日志中看到)。Connection accepted

事实证明,我只需要将其添加到代码中连接字符串的末尾:

?directConnection=true
Run Code Online (Sandbox Code Playgroud)

连接字符串:

mongodb://myUserId:myPassword@mongodb/myDatabase?directConnection=true
Run Code Online (Sandbox Code Playgroud)

我希望 mongodb 更好地记录这一点,因为我只是在使用该客户端连接时查看 mongosh 日志时偶然发现的。

  • 我很高兴看到这个答案,但不幸的是,它对我没有帮助,因为我正在使用“SRV”连接字符串。这是我在尝试此解决方案后遇到的错误:“MongoAPIError:SRV URI 不支持 directConnection” (8认同)
  • 我的天啊。花了我一天的时间才找到这个提示!谢谢! (4认同)
  • 这个答案非常有帮助:) (4认同)
  • 这真的很有帮助,在我发现这个之前浪费了好几天。 (3认同)
  • MongoDB 副本集是一组存储相同数据集的连接实例。这种配置提供了数据冗余和高数据可用性。通过启用“directConnection=true”,您将失去此功能。https://www.mongodb.com/docs/drivers/go/current/fundamentals/connection/ (2认同)

Kun*_*kar 30

只需转到 mongodb atlas 管理面板。进入安全选项卡>网络访问>然后通过添加将您的 IP 列入白名单

查看此图片以找到特定菜单

注意:在谷歌上检查你的IP然后添加它

  • 这样做了,但没有运气。相反,我允许所有IP,但仍然不起作用 (3认同)
  • 兄弟,你的数据库配置正确了吗 (2认同)
  • 能够解决它,一切都是正确的,但是防火墙阻止了对端口 27017 的访问,同样可以在这里测试:http://portquiz.net:27017/ (2认同)

Shr*_*nan 17

就我而言,这个问题是在 NodeJS 版本从 Node 14 升级到 Node 17 之后发生的,并且 mongoose 未在本地连接到 MongoDB。

解决方案 - 在连接字符串中,更改localhost127.0.0.1.

参考 - https://github.com/Automattic/mongoose/issues/10917#issuecomment-957671662


小智 8

有时当你的 MongoDB 服务关闭时也会发生这种情况。

以下是打开 MongoDB 服务的步骤:

  1. 按窗口key + R打开运行窗口。
  2. 然后键入services.msc以打开服务窗口。
  3. 然后选择MongoDB服务器,右键单击它,最后单击start.


Sma*_*ggs 6

确保在替换用户和密码字段时删除“<”和“>”。这对我有用


Bat*_*tne 6

我得到了同样的错误。这些是我为解决它而遵循的步骤

  1. 登录您的 Mongo Atlas 帐户
  2. 转到安全选项卡 -> 网络访问 ->然后将您的 IP 列入白名单
  3. 然后转到安全选项卡 -> 数据库访问 ->并删除您当前的用户。
  4. 通过提供新的用户名和密码来创建一个新用户。
  5. 提供对新创建的用户名和密码.ENV文件或mongoose.connect方法

在这些步骤之后,它照常工作。希望这会帮助你们。


Odu*_*hin 6

有时会发生此错误是由于 IP 地址允许访问我们的数据库。

请注意,您的应用程序可以正常运行,然后出现此类错误。每当发生这种情况时,大多数情况下您的 IP 地址已更改,这不在允许的地址白名单中。

您所要做的就是使用您当前的 IP 地址更新白名单

  • 如果 0.0.0.0 位于包含我的 IP 地址的 IP 地址中并且问题仍然存在怎么办? (5认同)

Dan*_*cki 5

您是否在使用任何防病毒软件、防火墙、VPN 或受限网络(例如工作/商业 Wi-Fi/LAN 连接)?然后尝试将其关闭/重新连接到不同的网络。某些 IP/连接可能会被您正在使用的网络管理员阻止,或者只是防病毒软件可能有防火墙策略。即使您有0.0.0.0MongoDB IP AddressAtlas。


小智 0

我遇到了这个问题,对我来说,解决方案是检查我的 IP 是否配置正确,然后在此屏幕中确认

在此输入图像描述