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。
相关:
- dotenv github 自述文件: https://github.com/motdotla/dotenv#readme
- 使用 Node.js 连接到 MongoDB 数据库
:https://developer.mongodb.com/quickstart/node-connect-mongodb/
我的情况主要是 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 集群因长时间不活动而自动暂停而引发此错误。我刚刚恢复了,然后就正常启动了。
我是 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。
相关:
- dotenv github 自述文件: https://github.com/motdotla/dotenv#readme
- 使用 Node.js 连接到 MongoDB 数据库 :https://developer.mongodb.com/quickstart/node-connect-mongodb/
我的情况主要是 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 集群因长时间不活动而自动暂停而引发此错误。我刚刚恢复了,然后就正常启动了。