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



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

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

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

node server.js

但我得到了以下错误:

MongoDB连接错误:MongoTimeout错误:服务器选择超时30000毫秒后退出在超时时_onTimeout(C:\RND\fullstack_app\backend\node_modules\mongodb\lib\core\sdam\server_selection.js:308:9)at listOnTimeout(internal/timers.js:531:17)在processTimers(internal/timers.js:475:7){name:"MongoTimeoutError",原因:错误:连接ETIMEDOUT99.80.11.208:27017在TCPConnectWrap.afterConnect〔as oncomplete〕(net.js:1128:14){name:'MongoNetworkError',[Symbol(mongoErrorContextSymbol)]:{}},[Symol(mongoError ContextSymbol未处理的PromiseRejection警告:MongoTimeout错误:服务器选择30000毫秒后超时在超时时_onTimeout(C:\RND\fullstack_app\backend\node_modules\mongodb\lib\core\sdam\server_selection.js:308:9)at 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'));

有什么建议吗?

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

请参阅此图以定位特定菜单

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

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

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

?directConnection=true

连接字符串:

mongodb://myUserId:myPassword@mongodb/myDatabase?directConnection=true

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

在我的案例中,这个问题发生在NodeJS版本从Node 14升级到Node 17之后,并且猫鼬没有在本地连接到MongoDB。

解决方案-在连接字符串中,将localhost更改为127.0.0.1

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

有时会由于数据库中给定的访问IP地址而出现此错误。

请注意,您的应用程序可能运行良好,然后出现这样的错误。任何时候发生这种情况,大多数时候你的IP地址都会发生更改,这不在允许的地址白名单上。(IP地址可以是动态的,可能会发生变化)

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

我得到了同样的错误。以下是我为解决问题所遵循的步骤

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

经过这些步骤后,一切如常。希望这对你们有帮助。

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

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

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

在替换用户和密码字段时,请确保删除"<"one_answers">">这对我有效

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

我能够解决这个问题。一切都很好,但防火墙阻止了对27017端口的访问。连接可以在http://portquiz.net:27017/或者使用telnet到可以从集群->度量中检索的端点。

谢谢大家的建议

将您的连接IP地址列入白名单Atlas只允许客户端从项目白名单中的条目连接到集群。项目白名单不同于API白名单,后者限制API访问特定的IP或CIDR地址。

注意

如果Atlas在设置连接安全步骤中指示您已经在集群中配置了白名单条目,则可以跳过此步骤。要管理IP白名单,请参阅将条目添加到白名单。

如果白名单为空,Atlas会提示您将IP地址添加到项目的白名单中。您可以:

单击"添加当前IP地址"将您当前的IP地址列入白名单

单击Add a Different IP Address可添加单个IP地址或CIDR标记的地址范围

对于部署在亚马逊网络服务(AWS)上并使用VPC对等网络的Atlas集群,您可以添加一个与对等VPC关联的安全组。

您可以为新添加的IP地址或CIDR范围提供可选描述。单击添加IP地址将地址添加到白名单中

您可以删除{useUnifiedTopology:true}标志并重新安装猫鼬dependency!它对我有效。

致任何仍在为这个问题而挣扎的人。我通过在mongoose选项本身中设置用户名、密码和dbName等所有参数来解决这个问题。

早些时候的代码是这样的。(当我得到错误时)。

import mongoose from "mongoose";
mongoose.Promise = require("bluebird");
let dbName = process.env.DB_NAME;
const dbAddress = process.env.DB_HOST;
const dbPort = process.env.DB_PORT;
if(!dbName || !dbAddress || !dbPort){
throw new Error("Mongo error unable to configuredatabase");
}
let options = {
useNewUrlParser: true,
useUnifiedTopology: true,
user:process.env.DB_USER,
pass: process.env.DB_PASS
};
mongoose.connect(`mongodb://${dbAddress}:${dbPort}/${dbName}`, options).catch(err => {
if (err.message.indexOf("ECONNREFUSED") !== -1) {
console.error("Error: The server was not able to reach MongoDB. Maybe it's not running?");
process.exit(1);
} else {
throw err;
}
});

请注意mongo connect中的url。CCD_ 10。

没有错误的新代码。

import mongoose from "mongoose";
mongoose.Promise = require("bluebird");
let dbName = process.env.DB_NAME;
const dbAddress = process.env.DB_HOST;
const dbPort = process.env.DB_PORT;
// console.log("process.env", process.env)
if(!dbName || !dbAddress || !dbPort){
throw new Error("Mongo error unable to configuredatabase");
}
let options = {
useNewUrlParser: true,
useUnifiedTopology: true,
user:process.env.DB_USER,
pass: process.env.DB_PASS,
dbName: dbName
};
mongoose.connect(`mongodb://${dbAddress}:${dbPort}`, options).catch(err => {
if (err.message.indexOf("ECONNREFUSED") !== -1) {
console.error("Error: The server was not able to reach MongoDB. Maybe it's not running?");
process.exit(1);
} else {
throw err;
}
});

注意选项和url。

这是我当地的env。不是生产环境。

希望对你有帮助。

尝试在集群-->connect-->连接应用程序中指定节点驱动程序版本2,2,12。新字符串必须带有mongodb://。使用此字符串进行连接。不要忘记输入密码

这个线程中的大多数答案都应该可以解决您的问题,我尝试了所有答案,并将所有IP列入了白名单,但仍然无法连接到数据库。

有趣的是,当我试图连接到mongo图谱时,我的系统被连接到了一个VPN。所以,我只是断开了VPN,并能够连接到数据库。这只是一个简单的问题,因此我无法连接到数据库。

我有这个问题,对我来说,解决方案是检查我的ip是否配置正确,然后在这个屏幕上确认

在此处输入图像描述

检查您的密码、用户名或IP配置。大多数情况下,只要您的上述内容与服务器配置不匹配,就会出现"服务器选择超时30000毫秒后超时。_onTimeout"。

尝试使用默认的身份验证方法"SCRAM"在数据库访问中创建新用户。然后为其创建一个新的集群。它对我有用!我的server.js文件

const express = require('express');
const cors = require('cors');
const mongoose = require('mongoose');
require('dotenv').config();
const app = express();
const port = process.env.PORT || 5000;
app.use(cors());
app.use(express.json());
//const uri = process.env.ATLAS_URI;
mongoose.createConnection("mongodb+srv://u1:u1@cluster0-u3zl8.mongodb.net/test", { userNewParser: true, useCreateIndex: true,  useUnifiedTopology: true}
);
const connection = mongoose.connection;
connection.once('once', () => {
console.log(`MongoDB databse connection established successfully`);
})
app.listen(port, () => {
console.log(`Server is running on port: ${port}`);
});

您的猫鼬版本是什么?因为某个猫鼬版本有问题。请访问此链接了解更多详细信息"https://github.com/Automattic/mongoose/issues/8180".无论如何,我也面临着同样的问题,但在使用了旧版本(5.5.2)后,它对我有效。请尝试一下,让我知道发生了什么。

这基本上可能是因为npm更新。我刚刚更新到npm v6.13.7。我开始犯这个错误。

按照@Matheus的指示,我评论了"{useUnifiedTopology:true}"一行,我得以通过它。

我更新了猫鼬,一切都很好。

我也遇到了同样的问题。我可以使用Atlas给我的连接字符串从MongoDB Compass或Node应用程序进行连接。我通过将我的IP地址添加到Atlas的白名单中来解决这个问题。

对于任何可能面临mongoose v6+和nodejs和白名单问题的人来说,您的ip并没有解决这个问题,或者从localhost更改为127.0.0.1。

解决方案为猫鼬客户端连接选项设置以下选项:

mongoose.connect(url, { 
maxIdleTimeMS: 80000,
serverSelectionTimeoutMS: 80000,
socketTimeoutMS: 0,
connectTimeoutMS: 0
}

这些选项阻止mongoose客户端在从DB集群中选择主连接之前对连接进行计时。

请记住设置与您的设置相关的任何其他选项,例如,如果您正在运行群集,请确保设置replicaSet选项,或者如果您启用了身份验证,请设置authSource选项或要连接到dbName的数据库。

其中一些选项可以在连接字符串中设置。

选项的完整列表可在此处找到:https://mongodb.github.io/node-mongodb-native/4.2/interfaces/MongoClientOptions.html#authSource

如果您的配置正常,但仍然显示错误,可能是因为数据库中的数据太多(对我来说,我正在使用免费层来测试我的应用程序,我上传帖子,帖子是带有一些描述的图像),所以我只是删除了数据库,之后它运行良好。希望这能帮助到别人。

您的问题是您的计算机上没有安装MongoDB。下载后,您可以更改

mongoose.connect('mongodb://localhost:27017/blog')

mongoose.connect('mongodb://127.0.0.1/blog')

这一定是暂时的网络问题。请在一段时间后尝试连接,希望一切都会好起来。但一定要把你的ip地址列入白名单。

我已经通过使用以下方法解决了这个问题,即使用回调。

const uri = '';
mongoose
.connect(uri, { useNewUrlParser: true, useUnifiedTopology: true }, () => {
console.log("we are connected");
})
.catch((err) => console.log(err));

相关内容

最新更新