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 可能无法正常工作。
小智 6
确保将节点版本更改为 2.2.12:

并添加IP地址:

小智 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)
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 )
就我而言,这主要是 mac 中的 DNS 问题,要解决它,只需在 mac book pro 设置的 DNS 部分下添加 google DNS 服务器:
8.8.8.8
4.4.4.4
Run Code Online (Sandbox Code Playgroud)