无法使用 Mongoose 连接到 MongoDB Atlas
Posted
技术标签:
【中文标题】无法使用 Mongoose 连接到 MongoDB Atlas【英文标题】:Cannot Connect to MongDB Atlas using Mongoose 【发布时间】:2020-02-22 09:10:10 【问题描述】:我开始学习 MERN 堆栈教程。我最初创建了一个 react 应用程序,添加了一个名为 backend 的目录,安装了 express、cors、express 和 dotenv,然后创建了一个 server.js 并添加了一些代码,但是在连接到 mongodb atlas 后,我收到以下错误:
(node:5828) UnhandledPromiseRejectionWarning: MongoTimeoutError: 服务器选择在 30000 毫秒后超时 在超时。 (C:\Users\Lenovo\Desktop\REACTion\mernapp\backend\node_modules\mongodb\lib\core\sdam\topology.js:878:9) 在 listOnTimeout (internal/timers.js:531:17) 在 processTimers (internal/timers.js:475:7) (node:5828) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。这 错误源于在异步函数内部抛出 没有 catch 块,或拒绝未处理的承诺 使用 .catch()。 (拒绝 ID:1)(节点:5828)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。在 未来,未处理的承诺拒绝将终止 具有非零退出代码的 Node.js 进程。 [nodemon] 重启由于 更改... [nodemon] 开始
node server.js
服务器正在运行 端口:5000 连接失败! MongoTimeoutError:服务器选择 30000 毫秒后超时 在超时。 (C:\Users\Lenovo\Desktop\REACTion\mernapp\backend\node_modules\mongodb\lib\core\sdam\topology.js:878:9) 在 listOnTimeout (internal/timers.js:531:17) 在 processTimers (internal/timers.js:475:7) name: 'MongoTimeoutError', reason: MongoNetworkError: connection 2 to cluster0-shard-00-01-l6mnq.gcp.mongodb.net:27017 关闭 在 TLSSocket。 (C:\Users\Lenovo\Desktop\REACTion\mernapp\backend\node_modules\mongodb\lib\core\connection\connection.js:356:9) 在 Object.onceWrapper (events.js:288:20) 在 TLSSocket.emit (events.js:200:13) 在 net.js:586:12 在 TCP.done (_tls_wrap.js:479:7) 名称:'MongoNetworkError', 错误标签:['TransientTransactionError'], [Symbol(mongoErrorContextSymbol)]: , [Symbol(mongoErrorContextSymbol)]:
下面是我的 server.js 文件代码。我从 MongoDB atlas 复制了 uri 并将其粘贴到 .env 文件中。
const express = require('express');
const cors = require('cors');
const mongoose = require('mongoose');
require('dotenv').config();
const app = express();
const port = process.env.PORT || 5000;
app.use(cors());
app.use(express.json());
const uri = process.env.ATLAS_URI;
mongoose
.connect(uri, useUnifiedTopology: true, useNewUrlParser: true, useCreateIndex: true )
.then(() =>
console.log('Connected to database!');
)
.catch(error =>
console.log('Connection failed!');
console.log(error);
);
const connection = mongoose.connection;
connection.once('open', () =>
console.log('MongoDB database connection established successfully');
);
app.listen(port, () =>
console.log(`Server is running on port: $port`);
);
【问题讨论】:
出于某种原因,现在一切正常。我猜这是mongodb服务器的问题。 是的,你说对了一部分。 node.js 中带有 process.env.var 的较新驱动程序无法正确解析。如果您在直接 var 中分配相同的字符串而不是它的工作原理。连接字符串和数据库名称也一样。 我不确定,但我认为将 atlas 中的所有 ip 列入白名单可能会解决问题。 是的,这是强制性步骤。我以为你知道这件事。如果您想进行测试,也可以将所有 IP 地址列入白名单。但是,这不是推荐的方式。 【参考方案1】:我也遇到过类似的问题, 请删除 useUnifiedTopology: true 或将其设为 false 这可以解决您的问题。我不知道为什么,但这解决了我的问题。
【讨论】:
【参考方案2】:你在本地安装好 mongoDB 了吗?
https://docs.mongodb.com/manual/administration/install-community/
【讨论】:
【参考方案3】:验证系统环境变量的内容,在新的控制台窗口中输入命令“echo %ATLAS_URI%”,如果没有出现 URI 则需要添加:
-
在搜索中,搜索并选择:系统(控制面板)。
点击高级系统设置链接。
点击环境变量。在 系统变量 部分中,找到 PATH 环境变量并选择它。点击Edit如果PATH环境变量不存在,点击New。
在编辑系统变量(或新建系统变量)窗口中,指定PATH 环境变量的值。点击OK点击OK关闭所有剩余的窗口。
如果您已经添加了它,则需要重新启动计算机并尝试 "echo %ATLAS_URI%" 命令。
【讨论】:
以上是关于无法使用 Mongoose 连接到 MongoDB Atlas的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Mongoose 连接到 MongoDB Atlas
节点/快速应用程序无法使用mongoose连接到Mongodb Atlas