一尘不染

将Heroku App连接到Atlas MongoDB Cloud服务

node.js

为了解决这个问题,我是否需要在Heroku 上获得 SSL 支持才能使用SSL 在 HerokuAtlas MongoDBCloud 之间建立连接?(访问Atlas MongoDB
Cloud服务需要 TSL / SSL连接)。

我试图将用node.js编写的Heroku应用程序连接到Atlas MongoDB Cloud托管的集群。

我当前的数据库托管在mLab(作为Heroku插件)上,用于通过猫鼬访问集群的MongoDB URI是(使用 xxx 省略机密信息):

MONGODB_URI="mongodb://xxx:xxx@xxx-a0.mlab.com:23266,xxx-a1.mlab.com:xxx/xxx?replicaSet=rs-xxx"

现在,我已经将数据从mLab迁移到Atlas MongoDB Cloud,现在我正在使用URI访问集群:

MONGODB_URI="mongodb://xxx:xxx@cluster0-shard-xxx.mongodb.net:xxx,cluster0-shard-xxx.mongodb.net:xxx,cluster0-shard-xxx.mongodb.net:xxx/xxx?replicaSet=xxx&ssl=true&authSource=admin"

在计算机上本地运行Heroku App时,我可以毫无问题地访问数据库。我还可以使用mongo shell连接到集群。

但是,在Heroku中运行该应用程序时,无法建立连接。在浏览器JS控制台中,我收到503服务不可用的消息。在heroku中,我得到了错误:

no primary found in replica set

我知道Atlas MongoDB Cloud需要SSL连接,这与mLab不同。在本地计算机中,我假设正在使用自签名证书来成功连接到群集。

我的问题是:我是否需要在Heroku中获得SSL支持才能访问Heroku和MongoDB Atlas之间的安全连接?还是仅在客户端/
Heroku安全连接中需要Heroku中的SSL支持?


阅读 309

收藏
2020-07-07

共1个答案

一尘不染

我认为可能会解决您的问题

免责声明: 我没有使用Heroku或MongoDB Atlas,但是我正在研究它们。

根据我发现的Github问题,如果未在MongoDBAtlas中将服务器IP地址列入白名单,则会收到该错误消息。

阅读MongoDB Atlas文档时,我看到将其与Herokudynos结合使用的唯一方法是将0.0.0.0/0(即所有地址)添加到MongoDBAtlas白名单中。

尝试一下,请报告是否可以实例化连接。

在SSL上

尝试回答SSL问题,尽管我不太确定,但您不需要根据我所读的内容在Heroku上启用它。

如果MongoDB服务器执行证书验证,则用于连接到它的Node.js代码必须类似于以下内容(摘自Node.js驱动程序文档):

var MongoClient = require('mongodb').MongoClient,
  f = require('util').format,
  fs = require('fs');

// Read the certificates
var ca = [fs.readFileSync(__dirname + "/ssl/ca.pem")];
var cert = fs.readFileSync(__dirname + "/ssl/client.pem");
var key = fs.readFileSync(__dirname + "/ssl/client.pem");

// Connect validating the returned certificates from the server
MongoClient.connect("mongodb://localhost:27017/test?ssl=true", {
  server: {
      sslValidate:true
    , sslCA:ca
    , sslKey:key
    , sslCert:cert
    , sslPass:'10gen'
  }
}, function(err, db) {
  db.close();
});

如果MongoDB服务器未检查任何SSL证书,则可以简单地使用如下代码(也来自Node.js驱动程序文档):

var MongoClient = require('mongodb').MongoClient;

MongoClient.connect("mongodb://localhost:27017/test?ssl=true", function(err, db) {
  db.close();
});

鉴于阿特拉斯文档包含了连接到它从Node.js的下面的示例代码,我认为你 不是 要在Heroku上启用SSL:

var MongoClient = require('mongodb').MongoClient;

var uri = "mongodb://kay:myRealPassword@mycluster0-shard-00-00-wpeiv.mongodb.net:27017,mycluster0-shard-00-01-wpeiv.mongodb.net:27017,mycluster0-shard-00-02-wpeiv.mongodb.net:27017/admin?ssl=true&replicaSet=Mycluster0-shard-0&authSource=admin";
MongoClient.connect(uri, function(err, db) {
  db.close();
});

2020-07-07