我是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
});
});
});
那么,有谁知道如何解决此错误,并可能解释这里发生了什么事情?
答案 0 :(得分:6)
当您使用MongoDB Atlas并失去Internet连接时,有时会发生此错误。您将无法访问数据库。
答案 1 :(得分:5)
答案 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)
答案 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:
并添加IP地址:
答案 12 :(得分:0)
在项目的根目录中创建一个 .env 文件。 https://github.com/motdotla/dotenv
此错误的一种情况是创建 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
在根文件夹中,但文件是空:
解决此问题的第一步是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;