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


我正在try 连接我的Heroku应用程序,用node编写.js,到Atlas MongoDB Cloud托管的集群.

我当前的数据库托管在mLab(作为Heroku插件),用于通过mongoose访问集群的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应用程序时,我可以毫无问题地访问数据库.我还可以使用mongo shell连接到集群.

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

no primary found in replica set

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

我的问题是:为了能够在Heroku和MongoDB Atlas之间建立安全连接,我是否需要在Heroku中获得SSL支持?或者Heroku中的SSL支持仅用于客户端/Heroku安全连接?

推荐答案

What I think might fix your problem

Disclaimer:我既没有使用Heroku也没有使用MongoDB Atlas,但我正在研究它们.

根据to a Github issue I found,如果您没有在MongoDB Atlas中列出服务器IP地址,您将收到该错误消息.

阅读MongoDB Atlas docs,我认为与Heroku dynos结合使用的唯一方法是将0.0.0.0/0(即所有地址)添加到MongoDB Atlas白名单中.

try 一下,然后请报告是否可以实例化连接.

On SSL

为了回答SSL问题,我不认为您需要根据我读到的内容在Heroku上启用它,尽管我不完全确定.

如果MongoDB服务器执行了证书验证,则 node .连接到它的js代码必须如下所示(取自Node.js driver documentation):

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 driver documentation):

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

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

假设Atlas documentation包含以下从 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();
});

Node.js相关问答推荐

monorepo内的NPM包使用不在注册表中的本地包

Node.js分页返回空数组

用于SLACK命令返回json而不是文本的AWS lambda函数

获取页面大小为10的所有文章,每篇文章填充一些所需的用户信息

Sass-TypeError:无法读取未定义的属性(正在读取';indexOf';)

如何使用 Node.js 连接到 Cloud SQL?

2023年如何在Node.js中使用Gmail发送邮箱?

我需要聚合两个 MongoDB 集合

如何修复我的 NodeJS SSE 写入函数以在后续调用中更新 HTML?

Google App Engine 突然不允许我部署我的 node.js 应用程序

Gulp 能否向 Docker 发出增量构建的第一次迭代完成的信号?

如何使用包含条件正确分页的 sequelize 查询?

运行 cypress 测试时如何指定 .env 文件用于我的开发服务器?

Axios GET 返回不可读的响应

使用正则表达式查找文档,但输入是数组

如何在 mongoDB 中进行全动态搜索?

node.js 变量不存在代码块

如何在 mongoDB 中用值 0 填充缺失的文档?

Forever + Nodemon 一起运行

node.js 在控制台上显示未定义