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

Noo*_*les 25 mongoose mongodb node.js express 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 at QueryReqWrap.onresolve [as oncomplete] (dns.js:199:19) errno: 'EREFUSED', code: '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
    });
  });
});

Run Code Online (Sandbox Code Playgroud)

那么有没有人知道如何修复这个错误并解释这里发生了什么?

Noo*_*les 45

如果您遇到此错误,请尝试对 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
Run Code Online (Sandbox Code Playgroud)

根据 MongoDB 的说法,由于 Mongoose,SRV 可能无法正常工作。

  • 当我询问MongoDB工作人员时,他们说可能是因为Mongoose,但我不知道具体答案。 (2认同)

小智 37

我在连接Nodeversion时遇到了同样的错误,我3.0 or later通过降级到2.2.12 or laterversion解决了它:

降级


Kam*_*ngh 13

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


小智 6

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

在此处输入图片说明

并添加IP地址:

在此处输入图片说明

  • 这是我的问题 - 新的统一连接字符串有时会起作用,有时则不起作用。排除故障非常令人沮丧。回到旧的连接字符串格式,它立即再次工作。 (2认同)

小智 5

将选项传递{ 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));
Run Code Online (Sandbox Code Playgroud)


Ham*_*ada 5

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}`)
    })
  })
Run Code Online (Sandbox Code Playgroud)

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


HMa*_*gdy 5

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

8.8.8.8
4.4.4.4
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 恢复集群后,这对我有用。 (2认同)

Roh*_*rte 5

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