我创建了一个简单的节点并表达应用程序。我正在尝试连接到Atlas上的群集,但是它始终无法连接。
以下是我的index.js文件:
const express = require("express");
const mongoose = require("mongoose");
const bodyParser = require("body-parser");
var cors = require("cors");
mongoose.Promise = global.Promise;
// create express app
const app = express();
app.use(cors());
// parse requests of content-type - application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true }));
// parse requests of content-type - application/json
app.use(bodyParser.json());
const url = "mongodb+srv://<username>:<password>@cluster1-n60yg.mongodb.net/test";
//Connecting to the database
mongoose
.connect(url, {
dbName: "testdb"
})
.then(() => {
console.log("Successfully connected to the database");
})
.catch(err => {
console.log("Could not connect to the database. Exiting now...", err);
process.exit();
});
// define a simple route
app.get("/", (req, res) => {
res.json({ message: "this will br crud" });
});
// listen for requests
app.listen(3000, () => {
console.log("Server is listening on port 3000");
});
运行代码约1-2分钟后,抛出此错误:
Could not connect to the database. Exiting now... { MongoNetworkError: failed to connect to server [cluster1-shard-00-00-n60yg.mongodb.net:27017] on first connect [MongoNetworkError: connection timed out]
at Pool.<anonymous> (/home/nikhil/Documents/node-graphql-mongo-crud/node_modules/mongodb-core/lib/topologies/server.js:431:11)
at emitOne (events.js:116:13)
at Pool.emit (events.js:211:7)
at connect (/home/nikhil/Documents/node-graphql-mongo-crud/node_modules/mongodb-core/lib/connection/pool.js:557:14)
at makeConnection (/home/nikhil/Documents/node-graphql-mongo-crud/node_modules/mongodb-core/lib/connection/connect.js:39:11)
at callback (/home/nikhil/Documents/node-graphql-mongo-crud/node_modules/mongodb-core/lib/connection/connect.js:261:5)
at TLSSocket.err (/home/nikhil/Documents/node-graphql-mongo-crud/node_modules/mongodb-core/lib/connection/connect.js:286:7)
at Object.onceWrapper (events.js:313:30)
at emitNone (events.js:106:13)
at TLSSocket.emit (events.js:208:7)
at TLSSocket.Socket._onTimeout (net.js:422:8)
at ontimeout (timers.js:498:11)
at tryOnTimeout (timers.js:323:5)
at Timer.listOnTimeout (timers.js:290:5)
name: 'MongoNetworkError',
errorLabels: [ 'TransientTransactionError' ],
[Symbol(mongoErrorContextSymbol)]: {} }
此代码可在沙盒中运行(即连接成功)。但是由于某种原因,我无法从笔记本电脑连接它(我正在使用Ubuntu 18.04)。 我在公司代理后面。但是我尝试使用移动数据(蜂窝网络)进行此操作,但仍然无法正常工作。 我已经在mongodb地图集的“网络访问”设置中将所有IP(0.0.0.0/0)列入了白名单。
我看到了docs,并在“网络和防火墙要求”中找到了它:
如果在防火墙上为网络端口使用白名单,请在Atlas主机上打开> 27015到27017的端口以进行TCP和UDP通信。这样,您的>应用程序就可以访问存储在Atlas上的数据库。
这是我所缺少的步骤吗? 请提出解决此问题的方法。
编辑 我可以将其用于移动数据,但仍无法通过公司代理连接。有可行的解决方案吗?
答案 0 :(得分:0)
确保在查询中使用正确的用户名和密码,而且看起来您的数据库名称为testdb,并在查询中确保将“ test”替换为“ testdb”
const url = "mongodb+srv://<username>:<password>@cluster1-n60yg.mongodb.net/testdb";
答案 1 :(得分:0)
我只是复制了您的代码并针对我自己的mongodb实例运行,并将网址更改为
const url = "mongodb+srv://admin:PASSWORD@cluster1-n60yg.mongodb.net/test?retryWrites=true";
工作正常,并打印输出“ 已成功连接到数据库”。
答案 2 :(得分:0)
我将我的IP地址列入了白名单(发现它之前已更改),或者您可以继续接受任何随机IP。
我还将连接放置在异步函数中。
代码:
// ======================== db configurations===========================//
mongoose.Promise = global.Promise;
const connectDB = async () => {
mongoose.connect(db.url, db.options);
console.log('DB Connected....');
};
connectDB();
希望这会有所帮助,祝您黑客愉快!