【发布时间】: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 地址列入白名单。但是,这不是推荐的方式。
标签: node.js mongodb express mern