无法从Node.js(Express)简单应用程序连接到MongoDB Atlas集群

时间:2019-08-07 06:02:58

标签: node.js mongodb express mongoose ubuntu-18.04

我创建了一个简单的节点并表达应用程序。我正在尝试连接到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上的数据库。

这是我所缺少的步骤吗? 请提出解决此问题的方法。

编辑 我可以将其用于移动数据,但仍无法通过公司代理连接。有可行的解决方案吗?

3 个答案:

答案 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();

希望这会有所帮助,祝您黑客愉快!