【问题标题】:Mongoose with ReplicaSet on Atlas在 Atlas 上使用 ReplicaSet 的 Mongoose
【发布时间】:2017-05-03 22:44:23
【问题描述】:

我在 MongoDB Atlas 上有一个副本集,这是我完美连接的 mongo shell 连接字符串:

$ mongo "mongodb://MY_SERVER-shard-00-00-clv3h.mongodb.net:27017,MY_SERVER-shard-00-01-clv3h.mongodb.net:27017,MY_SERVER-shard-00-02-clv3h.mongodb.net:27017/MY_DATABASE?replicaSet=MY_REPLICASET-NAME-shard-0" --ssl --username MY_USERNAME --password MY_PASSWORD --authenticationDatabase MY_ADMIN_DATABASE

如何将其转换为在猫鼬中使用?如何构建我的 uri 和 options 变量?

我尝试了以下方法但没有成功:

  // connection string using mongoose:
  var uri = 'mongodb://MY_USER:MY_PASSWORD@' +
    'MY_SERVER-shard-00-00-clv3h.mongodb.net:27017,' +
    'MY_SERVER-shard-00-01-clv3h.mongodb.net:27017,' +
    'MY_SERVER-shard-00-02-clv3h.mongodb.net:27017/MY_DATABASE';

  var options = {
    replset: {
      ssl: true,
      authSource: 'MY_ADMIN_DATABASE',
      rs_name: 'MY_REPLICASET_NAME-shard-0'
    }
  };

  mongoose.connect(uri, options);
  var db = mongoose.connection;

我尝试在选项中包含用户:并传递:,从 uri 中删除 MY_USER:MY_PASSWORD@,将 rs_name 更改为 replicaSet,每次尝试都不成功。 mongoose 似乎没有考虑 authSource 选项。

使用 mongojs,使用以下代码可以正常工作:

  // connection string using mongojs:
  var uri = 'mongodb://MY_USER:MY_PASSWORD@' +
    'MY_SERVER-shard-00-00-clv3h.mongodb.net:27017,' +
    'MY_SERVER-shard-00-01-clv3h.mongodb.net:27017,' +
    'MY_SERVER-shard-00-02-clv3h.mongodb.net:27017/MY_DATABASE';

  var options = {
    ssl: true,
    authSource: 'MY_ADMIN_DATABASE',
    replicaSet: 'MY_REPLICASET_NAME-shard-0'
  };

  var db = mongojs(uri,'', options);

但是,我需要使用猫鼬,因为我的项目中的 ODM。

如何使用 mongoose 构建我的 uri 和 options 变量?

【问题讨论】:

    标签: node.js mongodb mongoose replicaset


    【解决方案1】:

    在 MONGODB 3.4.x 上

    根据“副本集连接”部分的文档 (http://mongoosejs.com/docs/connections.html),我解决了将“选项”值直接放在“uri”字符串中的问题。

    // connection string using mongoose:
    var uri = 'mongodb://MY_USER:MY_PASSWORD@' +
      'MY_SERVER-shard-00-00-clv3h.mongodb.net:27017,' +
      'MY_SERVER-shard-00-01-clv3h.mongodb.net:27017,' +
      'MY_SERVER-shard-00-02-clv3h.mongodb.net:27017/MY_DATABASE' +
      'ssl=true&replicaSet=MY_REPLICASET_NAME-shard-0&authSource=MY_ADMIN_DATABASE';
    
    mongoose.connect(uri);
    var db = mongoose.connection;
    

    现在,它工作正常!

    关于 MONGODB 3.6 的通知

    在使用 3.6.x 版本的 MongoDB Atlas 上,连接字符串更改为使用 DNS 服务器,从而缩短了链接。

    mongodb+srv://MY_USER:MY_PASSWORD@MY_SERVER.mongodb.net/MY_DATABASE

    ...如果您在应用程序中使用此连接字符串,这将成功连接,但它只能与具有更高权限访问权限的 atlas 用户(atlasAdmin、readWriteAnyDatabase...)进行读写。

    如果您与特定用户一起工作,该用户仅具有读写数据库的权限,您需要保留 MongoDB 3.4 中使用的相同连接字符串,因为 mongoose 无法识别 DNS​​ 选项 (mongodb+srv)。

    附: MongoDB 3.6.x 的所有新资源将继续正常工作!

    【讨论】:

    • 你用的是什么版本的猫鼬?
    • "猫鼬": "^4.10.8" @AdeelImran Imran
    【解决方案2】:

    将用户名和密码添加到数据库连接

    mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
    

    Standard Connection String Format

    【讨论】:

    • 感谢 Engin,我做到了,我发现了真正的问题,问题是 mongoose 无法识别的 authSource ......我将在 github 上开一张票来解决这个问题。跨度>
    猜你喜欢
    • 1970-01-01
    • 2018-06-01
    • 2018-08-17
    • 1970-01-01
    • 2020-03-12
    • 2020-02-22
    • 2020-07-25
    • 2017-09-09
    • 2019-12-30
    相关资源
    最近更新 更多