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


11

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

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(内部/ processTimers(internal / timers.js:475:7)上的timers.js:531:17){名称:“ MongoTimeoutError”,原因:错误:在TCPConnectWrap.afterConnect上连接ETIMEDOUT 99.80.11.208:27017 [完成时](网络。 js:1128:14){名称:'MongoNetworkError',[Symbol(mongoErrorContextSymbol)]:{}},[Symbol(mongoErrorContextSymbol)]:{}}(节点:42892)UnhandledPromiseRejectionWarning:MongoTimeoutError:服务器选择在30000 ms之后超时在超时时._onTimeout(C:\ RND \ fullstack_app \ backend \ node_modules \ mongodb \ lib \ core \ sdam \ server_selection.js:308:9)在processTimers(internal / timers.js:475:7)在listOnTimeout(internal / timers.js:531:17)

我在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'));

有什么建议么?


1
您是否更改user:passwordusername and passwordin连接字符串?
Shivam Sood

@ShivamSood是的,我做到了
Arvind Krmar,

为了添加到信息中,我尝试使用MongoDB罗盘社区进行连接,但是它给出了相同的错误。可以在atLas Mongodb进行一些设置吗?
Arvind Krmar

2
应用程序在本地MongoDB“ mongodb://127.0.0.1/FullStack”上运行良好。似乎与Atlas MongoDB的连接是问题。
阿文德·科尔玛

1
我能够解决。防火墙阻止了访问,可以使用以下方法进行测试:portquiz.net
Arvind Krmar,

Answers:


25

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

看到此图像以找到特定菜单

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


2
做到了,但是没有运气。相反,我允许所有IP,但仍然无法使用
Arvind Krmar,

兄弟,您是否正确设置了数据库配置
kunal usapkar 19/12/17

我已经为数据库访问创建了角色:用户名:arvind身份验证方法:SCRAM MongoDBRoles:atlasAdmin @ admin是否需要在集群或“数据湖”中创建某些内容?
Arvind Krmar,

能够解决,一切都正确,但是防火墙阻止了对端口27017的访问,可以在此处进行测试:portquiz.net
Arvind Krmar,

好的
祝您编程

6

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


3

有时由于授予对数据库的访问权的IP地址而发生此错误。

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

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


2

将您的连接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地址,将地址添加到白名单。


1

您可以删除 {useUnifiedTopology:true}标志,然后重新安装猫鼬Dependecy!它为我工作。


删除{useUnifiedTopology:true}时,它会出现以下错误:(node:10020)DeprecationWarning:当前的服务器发现和监视引擎已弃用,并将在以后的版本中删除。要使用新的服务器发现和监视引擎,请将选项{useUnifiedTopology:true}传递给MongoClient构造函数。
阿文德·科尔玛

1

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

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

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


0

你可以试试:

// Import express
let express = require('express');
// Import Body parser
let bodyParser = require('body-parser');
// Import Mongoose
let mongoose = require('mongoose');
// Initialize the app
let app = express();

// Import routes
let apiRoutes = require("./api-routes");
// Configure bodyparser to handle post requests
app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(bodyParser.json());

// Connect to Mongoose and set connection variable
mongoose.connect('mongodb://XXXX:XXXX@cluster0-shard-00-00-ov74c.mongodb.net:27017,cluster0-shard-00-01-ov74c.mongodb.net:27017,cluster0-shard-00-02-ov74c.mongodb.net:27017/test?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin&retryWrites=true&w=majority', {useNewUrlParser: true})
    .then(()=>console.log("DB server connect"))
    .catch(e => console.log("DB error", e));


var db = mongoose.connection;

// Added check for DB connection

if(!db)
    console.log("Error connecting db")
else
    console.log("Db connected successfully")

// Setup server port
var port = process.env.PORT || 8080;

// Send message for default URL
app.get('/', (req, res) => res.send('Hello World with Express'));

// Use Api routes in the App
app.use('/api', apiRoutes);
// Launch app to listen to specified port
app.listen(port, function () {
    console.log("Running RestHub on port " + port);
});

@ArvindKrmar如果您登录了网站mongo?您选择了版本node 3.00 or later并复制了`mongodb + srv://用户:<密码> @ cluster0-3zrv8.mongodb.net /测试?RetryWrites = true&w =多数''?那里有三个选项可供选择,选择中间节点
Umbro,

我选择了“连接您的应用程序”节点,并复制了上面的连接字符串,替换了密码,但是我不确定该密码是什么,我登录atlast MongoDB所使用的密码还是其他密码?我试图找出
答案

@ArvindKrmar,您提供了一个单独的数据库密码
Umbro,

我在“数据库访问”部分创建了两个用户,并保留了与我在mongoDB上登录时使用的密码相同的密码,以确保安全,或者使应用程序开始运行,但到目前为止还算不错。
Arvind Krmar,

1
当我使用localhost“ mongodb://127.0.0.1/FullStack”时,代码可以正常工作。因此,与Atlas MongoDB的连接肯定存在一些问题。
阿文德·科尔玛

0

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

在此处输入图片说明


1
我找到了解决方案。问题出在我的网络系统的防火墙设置中。 portquiz.net:27017可用于测试连接是否通过。尽管我没有更改防火墙,因为它是在最后由网络管理员管理的,但是一旦防火墙纠正了它的正常工作。谢谢大家的建议。
阿文德·科尔玛

0

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


这是我最后的防火墙问题。我更正了它,现在它正在工作
Arvind Krmar,

0

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

谢谢大家的建议


0

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

0

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


我遇到了同样的问题,但是,我经常在打开和关闭VPN的情况下进行开发。通过再次打开我的VPN,我设法连接到数据库。我希望这个问题是暂时的,因为我无法始终打开我的VPN。
Mike K

0

可能基本上是因为npm更新。我刚刚更新到npm v 6.13.7。我开始得到那个错误。

按照@Matheus的指示,我在“ {useUnifiedTopology:true}”行中添加了注释,并能够通过它。

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


0

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


0

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


0

对于仍在努力解决此问题的任何人。我通过在猫鼬选项本身中设置所有参数(如用户名,密码和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,
    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。

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

希望对您有所帮助。


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.