Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 将Heroku应用程序连接到Atlas MongoDB云服务_Node.js_Mongodb_Ssl_Heroku_Mongoose - Fatal编程技术网

Node.js 将Heroku应用程序连接到Atlas MongoDB云服务

Node.js 将Heroku应用程序连接到Atlas MongoDB云服务,node.js,mongodb,ssl,heroku,mongoose,Node.js,Mongodb,Ssl,Heroku,Mongoose,为了解决这个问题:我是否需要在Heroku上获得SSL支持,以便使用SSL在Heroku和Atlas MongoDB云之间建立连接?(TSL/SSL连接是访问Atlas MongoDB云服务的一种方式) 我正在尝试将我用node.js编写的Heroku应用程序连接到Atlas MongoDB Cloud托管的集群 我当前的数据库托管在mLab(作为Heroku插件),用于通过mongoose访问集群的MongoDB URI是(使用xxx省略机密信息): 现在我已经将数据从mLab迁移到Atla

为了解决这个问题:我是否需要在Heroku上获得SSL支持,以便使用SSL在HerokuAtlas MongoDB云之间建立连接?(TSL/SSL连接是访问Atlas MongoDB云服务的一种方式)


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

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

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

no primary found in replica set
我知道Atlas MongoDB云需要SSL连接,这与mLab不同。在我的本地计算机中,我假设正在使用自签名证书成功连接到集群

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

我认为什么可以解决您的问题 免责声明:我既没有使用Heroku也没有使用MongoDB Atlas,但我正在研究它们

根据,如果您没有在MongoDB Atlas中白名单服务器IP地址,您将收到该错误消息

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

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

关于SSL 试图回答SSL问题,我不认为您需要根据我所读的内容在Heroku上启用它,尽管我不完全确定

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

如果MongoDB服务器没有检查任何SSL证书,您可以简单地使用如下代码(也取自):

鉴于包含以下用于从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();
});


我通过为数据库请求和其他TCP连接的静态IP地址安装一个插件(我使用的)来解决这个问题。
更多选项:非常简单的解决方案!只需将地址“0.0.0.0/0”添加到mongo atlas的白名单IP中


它将向全世界开放mongo地图册。。。。。因此,it操作系统不用于生产,但有助于小型测试

还必须将0.0.0.0/0添加到Mongo IP白名单中,并在Heroku上重新部署我的应用程序,以使其最终工作(在更改IP之前,引发CORS错误)。

您可以通过以下命令找到Heroku的所有IP范围:

HEROKU_REGION=eu; sudo apt -qqy install curl jq 2>/dev/null 1>/dev/null; heroku regions --json 2>/dev/null | jq ".[] | select(.name==\"$HEROKU_REGION\") | .provider.region" | (REGION=$(cat); curl -s https://ip-ranges.amazonaws.com/ip-ranges.json |  jq ".prefixes[] | select(.region==$REGION) | .ip_prefix")

由于允许从任何地方访问都是不安全的,而且IP范围可能会改变,因此我最终安装了附加组件
QuotaGuard静态IP的
(它为IP白名单提供了2个IP地址)

QGTunnel应该下载并包含在代码库中

curlhttps://s3.amazonaws.com/quotaguard/qgtunnel-latest.tar.gz |焦油xz
程序文件应该更新

web: bin/qgtunnel npm start

假设您希望使用QGTunnel访问复制的MongoDB群集,其中3个副本位于主机上:
rs01.MongoDB.net:52115
rs02.MongoDB.net:52115
,以及
rs1.MongoDB.net:52115
。对于此配置,您需要为中的端口52115上的每个主机创建3个单独的隧道。完成此操作后,QGTunnel将更改DNS解析过程,以将这些主机名解析为适当的环回地址,并且复制群集的自动发现应按预期工作。

登录到云MongoDB站点并转到网络访问单击添加IP地址,然后单击允许从任何位置进行访问


Niklas,你说得对!问题出在白名单访问中。关于SSL问题,我想你是对的,因为我从Herkou支持部门得到了以下回复:“(…)在应用程序中使用SSL完全独立于mongo连接,因此我认为这不会是一个问题。”更新():由于Heroku dynos使用AWS EC2实例IP范围的子集,可以将其添加到Cloud Atlas的白名单中,或者获得一个附加组件来提供静态出站IP地址,或者通过TLS使用安全通信。太棒了!谢谢你的回复,布鲁诺。:)谢谢分享,似乎很有用。免费层是月100请求100MB,听起来很低,什么算“请求”?你能分享一些你是如何做到这一点的代码吗?为了使用fixie socks并通过mongoose进行连接,我正在尝试理解我需要在node.js express代码中更改什么。我也希望看到这一点。今天早些时候我也发了电子邮件给Fixie Socks。我考虑过使用Fixie Socks,但这只适用于美国地区。Fixie Socks有效吗?我正在尝试完全相同的设置,但每次都失败。惊人的答案。如果有人想手动操作,因为他没有apt-找出你的heroku区域,然后转到并找到该区域的ip范围
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();
});
HEROKU_REGION=eu; sudo apt -qqy install curl jq 2>/dev/null 1>/dev/null; heroku regions --json 2>/dev/null | jq ".[] | select(.name==\"$HEROKU_REGION\") | .provider.region" | (REGION=$(cat); curl -s https://ip-ranges.amazonaws.com/ip-ranges.json |  jq ".prefixes[] | select(.region==$REGION) | .ip_prefix")
web: bin/qgtunnel npm start