How to fix 'Error: querySrv EREFUSED' when connecting to MongoDB Atlas?

How to fix 'Error: querySrv EREFUSED' when connecting to MongoDB Atlas?

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

{ Error: querySrv EREFUSED _mongodb._tcp.main-03xkr.mongodb.net at QueryReqWrap.onresolve [as oncomplete] (dns.js:199:19) errno: 'EREFUSED', code: 'EREFUSED', syscall: 'querySrv', hostname: '_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
    });
  });
});

那么有谁知道如何解决这个错误并解释这里发生的事情吗?

您的连接字符串中有 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 用于一个项目,该字符串(减去未定义的用户)看起来是正确的。

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

mongodb://<username>:<password>@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 可能由于 Mongoose 而无法工作。

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

在我们的例子中 antivirus/firewall 是阻塞的,

尝试禁用antivirus/firewall并再次检查。希望有用。

将选项 { 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));
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)

Error: querySrv ESERVFAIL _mongodb._tcp.databasename-zcbag.mongodb.net
    at QueryReqWrap.onresolve [as oncomplete] (dns.js:202:19) {
  errno: 'ESERVFAIL',
  code: 'ESERVFAIL',
  syscall: 'querySrv',
  hostname: '_mongodb._tcp.databasename-zcbag.mongodb.net'
}

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

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

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

并添加IP地址:

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

我安装了OpenWRT固件,忘了调整DNS设置。

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

这是一个互联网问题,就像 @Kamesh Kumar Singh 在他的回答中所说的那样。

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

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

“不在根文件夹”场景:

Create a .env file in the root directory of your project. https://github.com/motdotla/dotenv

此错误的一种情况是在 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: Error: querySrv ENOTFOUND _mongodb._tcp.undefined.mongodb.net at QueryReqWrap.onresolve [as oncomplete] (dns.js:207:19)

(node:27240) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag --unhandled-rejections=strict (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)

(node:27240) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.


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


解决方案

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


相关:

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

8.8.8.8
4.4.4.4

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

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

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; 

在我的例子中,由于 mongodb 集群因长时间不活动而自动暂停而引发此错误。我刚刚恢复了,然后就正常启动了。