连接到MongoDB Atlas时如何解决“错误:querySrv EREFUSED”?

时间:2019-04-03 15:43:45

标签: node.js mongodb express mongoose mongodb-atlas

我是MongoDB 4.0.6的新手,并尝试使用Node / Express.js将其实现到我的网站中,但是当我尝试连接到mongodb+srv://${process.env.MONGOUSER}:${process.env.MONGOPASS}@main-03xkr.mongodb.net/main时,出现此错误:

  

{错误:querySrv EREFUSED _mongodb._tcp.main-03xkr.mongodb.net       在QueryReqWrap.onresolve [完成时](dns.js:199:19)     errno:“ EREFUSED”,     代码:“ EREFUSED”,     syscall:“ querySrv”,     主机名:'_mongodb._tcp.main-03xkr.mongodb.net'}

我尝试连接到mongodb://localhost:27017/main,但这确实可行。

以下是相关代码:

require('dotenv').config();
const mongoose = require('mongoose');

// Database
const uri = `mongodb+srv://${process.env.MONGOUSER}:${process.env.MONGOPASS}@main-03xkr.mongodb.net/main`;
const localURI = 'mongodb://localhost:27017/main';

var Project = require('./models/project');

mongoose.connect(uri, { useNewUrlParser: true });
const db = mongoose.connection;

db.once('open', () => console.log('Successfully connected to MongoDB'));
db.on('error', (e) => console.log(e));

// Routes
app.get('/', (req, res) => {
  Project.find({}, (e, projects) => {
    if (e) console.log(e);

    res.render('home.ejs', {
      projects: projects
    });
  });
});

那么,有谁知道如何解决此错误,并可能解释这里发生了什么事情?

15 个答案:

答案 0 :(得分:6)

当您使用MongoDB Atlas并失去Internet连接时,有时会发生此错误。您将无法访问数据库。

答案 1 :(得分:5)

在连接Node版本3.0 or later时遇到了同样的错误,我通过降级为2.2.12 or later版本来解决了这个问题:

downgrade

答案 2 :(得分:3)

MongoClient.connect(
  "mongodb://USER:PASSWORT@mflix-shard-00-00-r5yfb.mongodb.net/test?ssl=true&replicaSet=mflix-shard-0&authSource=admin&retryWrites=true&w=majority",
  { useNewUrlParser: true, useUnifiedTopology: true },
)
  .catch(err => {
    console.error(err.stack)
    process.exit(1)
  })
  .then(async client => {
    await MoviesDAO.injectDB(client)
    await UsersDAO.injectDB(client)
    await CommentsDAO.injectDB(client)
    app.listen(port, () => {
      console.log(`listening on port ${port}`)
    })
  })

也许可以和MongoClient(不是Mongoose)一起使用

答案 3 :(得分:3)

错误:querySrv ESERVFAIL _mongodb._tcp.databasename-zcbag.mongodb.net 在QueryReqWrap.onresolve [完成时](dns.js:202:19){ errno:“ ESERVFAIL”, 代码:“ ESERVFAIL”, syscall:“ querySrv”, 主机名:“ _ mongodb._tcp.databasename-zcbag.mongodb.net” }


如果上面的代码是您的输出,则您的代码中没有错误。您必须检查网络连接。也许您必须将网络从电话网络切换到另一个网络,反之亦然。

答案 4 :(得分:2)

将选项{ useNewUrlParser: true, useUnifiedTopology: true }传递给MongoClient构造函数

const uri = "mongodb+srv://${process.env.MONGOUSER}:${process.env.MONGOPASS}@main-03xkr.mongodb.net/main"

mongoose.connect(uri, { useNewUrlParser: true, useUnifiedTopology: true })
    .catch(error => console.log(error));

答案 5 :(得分:2)

就我而言,这主要是 mac 中的 DNS 问题,要解决它,只需在 mac book pro 设置中的 DNS 部分下添加 google DNS 服务器:

8.8.8.8
4.4.4.4

enter image description here

答案 6 :(得分:1)

在我们的例子中,防病毒/防火墙被阻止了,

尝试禁用防病毒/防火墙,然后再次检查。希望它能工作。

答案 7 :(得分:1)

就我而言,当我的TP-Link路由器中的 DNS配置丢失时,就会发生此错误。

我已经在其中安装了OpenWRT固件,却忘记了调整DNS设置。

我可以打开YouTube或任何其他网站,因为那不是我的主要路由器,但无法连接到数据库。

这是一个互联网问题,例如 @Kamesh Kumar Singh 在他的回答中说。

我认为这不是该问题的常用答案,但可能会对某人有所帮助。

答案 8 :(得分:1)

如果您无法连接到mongoDB Atlas数据库,则会发生此错误。您的服务器运行成功,但是在连接数据库时出现此错误。确保您的互联网连接良好,然后重试,您将不会看到此错误。

答案 9 :(得分:0)

您的连接字符串中有undefined。我不知道这是不是错字。但是尝试更改

const uri = `mongodb+srv://undefined:${process.env.MONGOPASS}@main-03xkr.mongodb.net/main`;

const uri = `mongodb+srv://${process.env.MONGOUSER}:${process.env.MONGOPASS}@main-03xkr.mongodb.net/main`;

我将MongoAtlas用于项目,并且该字符串(减去未定义的用户)看起来正确。

答案 10 :(得分:0)

如果遇到此错误,请尝试对Node.js 2.2.12或更高版本使用较旧的连接字符串:

mongodb://:@ main-shard-00-00-03xkr.mongodb.net:27017,main-shard-00-01-03xkr.mongodb.net:27017,main-shard-00-02-03xkr .mongodb.net:27017 / main?ssl = true&replicaSet = Main-shard-0&authSource = admin&retryWrites = true

根据MongoDB,由于猫鼬,SRV可能无法正常工作。

答案 11 :(得分:0)

确保将节点版本更改为2.2.12:

enter image description here

并添加IP地址:

enter image description here

答案 12 :(得分:0)

“不在根文件夹中”方案:

<块引用>

在项目的根目录中创建一个 .env 文件。 https://github.com/motdotla/dotenv

enter image description here

此错误的一种情况是创建 dotenv .env 文件 --NOT-- 在 root folder 中(例如在 /src 下).

比这个代码:

const url = `mongodb+srv://${process.env.DB_USER}:${
  process.env.DB_USER_PASSWORD
}@${process.env.DB_CLUSTER}.mongodb.net`;

console.log(url)

输出:

mongodb+srv://undefined:undefined@undefined.mongodb.net

所以 "undefined" URL 连接:

const client = new MongoClient(url);

抛出 3 个警告:

<块引用>

(node:27240) UnhandledPromiseRejectionWarning: 错误: querySrv ENOTFOUND _mongodb._tcp.undefined.mongodb.net 在 QueryReqWrap.onresolve [as oncomplete] (dns.js:207:19)

<块引用>

(node:27240) UnhandledPromiseRejectionWarning:未处理的承诺 拒绝。此错误源于抛出异步 没有 catch 块的函数,或者通过拒绝一个承诺 不使用 .catch() 处理。在未处理的节点上终止节点进程 承诺拒绝,使用 CLI 标志 --unhandled-rejections=strict (见https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。 (拒绝编号:1)

<块引用>

(node:27240) [DEP0018] 弃用警告:未处理 不推荐使用承诺拒绝。在未来,承诺拒绝 未处理的将终止 Node.js 进程 非零退出代码。


另一种“关闭”场景: .env 在根文件夹中,但文件是

enter image description here


解决方案

解决此问题的第一步console.log(url)并检查process.env是否返回正确的Connection String


相关:

答案 13 :(得分:0)

就我而言,问题的发生是因为 MongoDB 因超过 4 个月的不活动而暂停了我的集群。在我登录我的帐户并恢复集群活动后,问题立即得到解决。

答案 14 :(得分:0)

我通过进入 MongoDB -> 登录 -> 数据库 -> 连接 -> 连接你的应用程序(中间一个) -> 复制代码 -> 将代码粘贴到我的 .JS 文件中的 mongooseDB 代码中解决了我的问题:< /p>

const mongoose = require('mongoose');
require('dotenv/config');

mongoose
  .connect(process.env.THE_MONGO_DB_URL_GOES_HERE_IN_DOTENV_FILE, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
  })
  .then(() => console.log("Database connected!"))
  .catch(err => console.log(err));

  const PostSchema = mongoose.Schema({
    email: String,
    password: String
  }, {strict: false});

  const DataEntry = mongoose.model('n26-users-collection', PostSchema); 

  module.exports = DataEntry;