将NodeJS连接到MongoDB Droplet

时间:2020-03-15 19:25:39

标签: node.js mongodb digital-ocean

因此,我决定用两个液滴(一个MongoDB图像液滴和一个NodeJS图像液滴)来设置我的项目。我这样做是为了将来更容易缩放两个液滴,并且将来在Ubuntu 18.04上,其他应用程序也可能会连接到数据库。

我收到以下错误:

Could not connect to the database:  { MongooseServerSelectionError: connection timed out
    at new MongooseServerSelectionError (/root/eternal-peace-code/node_modules/mongoose/lib/error/serverSelection.js:22:11)
    at NativeConnection.Connection.openUri (/root/eternal-peace-code/node_modules/mongoose/lib/connection.js:808:32)
    at Mongoose.connect (/root/eternal-peace-code/node_modules/mongoose/lib/index.js:333:15)
    at Timeout.setTimeout [as _onTimeout] (/root/eternal-peace-code/app.js:60:22)
    at ontimeout (timers.js:482:11)
    at tryOnTimeout (timers.js:317:5)
    at Timer.listOnTimeout (timers.js:277:5)
  message: 'connection timed out',
  name: 'MongooseServerSelectionError',
  reason: 
   TopologyDescription {
     type: 'Single',
     setName: null,
     maxSetVersion: null,
     maxElectionId: null,
     servers: Map { 'mongo_droplet_ip:27017' => [Object] },
     stale: false,
     compatible: true,
     compatibilityError: null,
     logicalSessionTimeoutMinutes: null,
     heartbeatFrequencyMS: 10000,
     localThresholdMS: 15,
     commonWireVersion: null },
  [Symbol(mongoErrorContextSymbol)]: {} }

我已经正确设置了两个服务器(所以我相信),我的MongoDB有两个用户(都是我,但是权限不同,我遵循了几次演练,所以才发生)。我的/etc/mongod.conf文件已经进行了相应的编辑:

net:
  port: 27017
  bindIp: 127.0.0.1,mongodb_droplet_ip
security:
  authorization: "enabled"

UFW防火墙启用了HTTPS,SSH和我的NodeJS_ip:27017。

我的NodeJS Droplet设置的域名指向正确的IP地址,letsencrypt设置为用于域名的安全连接。我现在遇到的问题是我无法从NodeJS应用程序连接到Mongo Drop,我也想确保它也已安全完成。 我的NodeJS连接代码使用的是Mongoose和一个变量环境文件,根据我在其他地方看到的另一个建议,我还在超时功能中拥有了整个连接:

setTimeout(async () => {
      console.log('Connecting to database...');
      const options = {
        user: process.env.DBUSER,
        pass: process.env.USERPASS,
        keepAlive: true,
        useNewUrlParser: true,
        useFindAndModify: false,
        useCreateIndex: true,
        useUnifiedTopology: true,
        sslCA: cert,
        connectTimeoutMS: 5000,
      }
      await mongoose.connect(process.env.LIVEDB, options)
      .then(() => {
        console.log('We are connected to the database');
      })
      .catch(err => {
        console.log('Could not connect to the database: ', err);
        connectWithTimeout();
        });
    }, 3000);

我已经尝试了两次尝试,但是我花了大约4天的时间使项目进入阶段/生产阶段,因此它可以随时随地启动,并随着时间的推移进行更新。

如果您还有其他需要,请告诉我。

我们将不胜感激所有帮助,

谢谢

1 个答案:

答案 0 :(得分:0)

我不知道您使用的URI格式。但是当我尝试将节点应用程序与AWS的Mongo实例连接时,我遇到了同样的问题。

使用带有所有集群名称的长URI字符串

mongoURI = 'mongodb://username:password@mongo-instance-shard-00-00-a4iv8.mongodb.net:27017,mongo-instance-shard-00-01-a4iv8.mongodb.net:27017,mongo-instance-shard-00-02-a4iv8.mongodb.net:27017/test?ssl=true&replicaSet=mongo-instance-shard-0&authSource=admin&retryWrites=true&w=majority'

代替这样的事情: mongodb + srv://server.example.com/

这对我有用。这也可能对您有帮助。

此外,在数字海洋link中也发现了这一点 和the connection string

的mongo文档
相关问题