使用mongoose和Fixie(Heroku add-on)连接到mongodb

6
我有一个托管在Atlas MongoDB Cloud集群上的mongodb数据库。我目前使用mongoose在我的node.js应用程序中访问数据库:
mongoose.connect("mongodb://user:pw@cluster0-shard-00-00-***.mongodb.net:***,cluster0-shard-00-01-***.mongodb.net:***,cluster0-shard-00-02-***.mongodb.net:***/admin?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin");

由于Atlas MongoDB Cloud有白名单,而Heroku没有为我的应用程序提供获取固定IP地址的可能性,因此我正在使用Fixie add-on。基本上,Fixie充当出站流量的代理。
通过这种方式,我可以通过HTTP请求资源,这些资源通过Fixie提供的固定IP地址进行隧道传输。但是我确实需要使用Fixie的代理连接到Atlas Cloud集群,以便从数据库中检索和修改数据。
mongoose能否做到这一点? mongoose.connect函数接受一个option参数,但我找不到关于通过代理建立连接的任何选项。
2个回答

11

我刚收到了Fixie团队的回复:

Fixie是一个http/https代理,因此它无法处理类似于您需要用于mongodb连接的更低级别的TCP连接。

当我询问使用SOCKS的可能性时,他们回答说:

看起来mongoose不支持原生的socks代理,也不接受自定义套接字(这就是Node数据库驱动程序MySQL和Postgres支持的方式)。

因此,显然在我的情况下,没有办法使用Fixie(Heroku插件提供的代理解决方案)通过mongoose建立与MongoDB Atlas集群的连接。


4
我处于与你相同的情况中(Heroku + Node/Express + Mongoose + MongoDB Atlas)。我目前知道的两种选择是:1)允许MongoDB Atlas接受来自0.0.0.0/0(所有IP地址)的流量,或者2)获取一个Heroku Private Space,该选项具有静态IP选项(需要他们的企业版,据说起价超过$1k/mo)。看起来Mongoose的node-mongodb-native/connection驱动程序需要接受自定义套接字连接。 - Pete
@ykorach 我不得不将我的Mongo网络IP列入白名单以接受流量0.0.0.0/0。由于这是一个沙盒应用程序,我并不真的在意。将来我可能会转移到AWS上的EC2以获得静态IP。 - drew578
@drew578 如果你将0.0.0.0/0添加到白名单中,那么你就会向整个互联网开放,因此使用Fixie获取静态IP的意义就不存在了。 我最终选择部署到AWS的EC2实例上。 - ykorach
1
@ykorach Fixie现在有另一个插件叫做Fixie Socks,它可以接受TCP流量。我正在尝试弄清楚如何使用它连接到我的Mongo实例。 - paulwithap
@paulwithap 你能用Fixie Socks连接到Mongo吗?我正在尝试使用它,但是无法弄清楚如何使其工作。不确定我需要对我的node.js api进行哪些更改。 - matrix4use
1
@matrix4use 不好意思 - 我们花了很多时间尝试弄清楚,但没有成功。我唯一能够让它工作的是这篇文章中最后一个示例:https://blog.apify.com/tunneling-arbitrary-protocols-over-http-proxy-with-static-ip-address-b3a2222191ff。然而,你需要使用常规的Fixie,而不是Fixie Socks才能让它工作。 - paulwithap

0
自2017年提出这个问题以来,很多事情已经发生了变化。从那时起,Mongoose已经增加了对代理选项的支持,而Fixie发布了Fixie Socks,这是一个专门用于代理数据库连接的SOCKS5代理。
要通过Fixie Socks连接到MongoDB服务器(包括MondoDB Atlas),您可以执行以下操作:
const mongoose = require('mongoose');
const fixieData = process.env.FIXIE_SOCKS_HOST.split(new RegExp('[/(:\\/@/]+'));

mongoose.connect(process.env.DB_CONNECTION,
    {
      proxyUsername: fixieData[0],
      proxyPassword: fixieData[1],
      proxyHost: fixieData[2],
      proxyPort: fixieData[3]
     },
    (error) => {
      if(error){
        console.log(error);
      } else {
        console.log('Connected to database');
      }
    }
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接