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连接错误:MongoTimeoutError:服务器选择定时   30000毫秒后熄灭       在超时._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){名称:'MongoTimeoutError',原因:错误:连接ETIMEDOUT   99.80.11.208:27017         在TCPConnectWrap.afterConnect上[完成时](net.js:1128:14){       名称:“ MongoNetworkError”,       [Symbol(mongoErrorContextSymbol)]:{}},[Symbol(mongoErrorContextSymbol)]:{}}(节点:42892)   UnhandledPromiseRejectionWarning:MongoTimeoutError:服务器选择   30000毫秒后超时       在超时._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'));

有什么建议吗?

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

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

,

有时会发生此错误,原因是该IP地址获得了访问我们数据库的权限。

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

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

,

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

See this image to locate the particular menu

注意:在Google上检查您的IP,然后将其添加

,

我遇到了同样的错误。这些是我要解决的步骤

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

完成这些步骤后,它照常工作。希望对您有帮助。

,

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

注意

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

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

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

单击“添加其他IP地址”以添加单个IP地址或CIDR标记的地址范围。

对于在Amazon Web Services(AWS)上部署并使用VPC对等的Atlas群集,您可以添加与对等VPC关联的安全组。

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

,

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

enter image description here

,

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

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

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

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

,

对于仍在努力解决此问题的任何人。我通过在猫鼬选项本身中设置所有参数(如用户名,密码和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中的url连接。 mongodb://${dbAddress}:${dbPort}/${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;
// console.log("process.env",process.env)
if(!dbName || !dbAddress || !dbPort){
    throw new Error("Mongo error unable to configuredatabase");
}

let options = {
    useNewUrlParser: true,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;
    }
});

请注意选项和网址。

这是我的本地环境。不是生产环境。

希望这会有所帮助。

,

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

,

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

,

这可能主要是因为npm更新。 我刚刚更新到npm v 6.13.7。我开始得到那个错误。

按照@Matheus的指示,我对“ {useUnifiedTopology:true}”行进行了注释,然后我就可以通过它。

我更新了猫鼬,一切正常。

,

尝试使用默认身份验证方法“ 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}`);
});
,

我能够解决问题。一切都很好,但是防火墙阻止了对端口27017的访问。可以在http://portquiz.net:27017/上测试连接性,也可以使用telnet到终结点,可以从clusters-> Metrics中获取。

谢谢大家的建议

,

检查您的密码,用户名或IP配置。通常,只要您的上述配置与服务器配置不匹配,就会出现“服务器选择在超时30000毫秒后超时。_onTimeout”。

,

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

,

您可以尝试:

private $last_query;

public function query($sql) {
    $this->last_query = $sql;
    return $this->adaptor->query($sql);
}

public function last_query() {
    return $this->last_query;
}
,

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

const uri = '';

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

我已经通过以下方式解决了这个问题。

const URI = "mongodb://127.0.0.1:27017/DashApp"
const connectDB = async () => {
    try {
        const connection = await mongoose.connect(
            URI,{
                useCreateIndex: true,useNewUrlParser: true,useFindAndModify: false,useUnifiedTopology: true
            }
        )
        console.log(`MongoDB connected: ${connection.connection.host}`);
    } catch (error) {
        console.log(`MongoDB error when connecting: ${error}`);
    }
}
connectDB()
本文链接:https://www.f2er.com/2983705.html

大家都在问