使用 ngrok 创建隧道以连接到 MongoDB 本地数据库

Posted

技术标签:

【中文标题】使用 ngrok 创建隧道以连接到 MongoDB 本地数据库【英文标题】:Create a tunnel with ngrok to connect to MongoDB local db 【发布时间】:2020-04-30 03:34:30 【问题描述】:

我想在两台计算机之间创建一个隧道。

计算机 1:前端(反应)

计算机 2:带有 MongoDB 本地数据库和 NodeJS 后端服务器的 API

我尝试使用 ngrok 在两台计算机之间创建隧道,以便我的合作伙伴可以测试/建立与 API 的连接。它不工作... ngrok 的安装已按照获取入门指南完成,没有问题。

我们做了什么:

    在计算机 1 上创建 NodeJS 的副本。

    在计算机 2 上,创建一个隧道以公开 MongoDB 端口 (27017):

ngrok http localhost:27017

    修改计算机 1 上的 MongoDB 连接字符串以指定 ngrok 链接,使其看起来像:'mongodb://username:pwd@xxxxxx.ngrok.io/dbname?authSource=admin',(而不是 'mongodb:/ /username:pwd@localhost:27017/dbname?authSource=admin',

问题是:当我们尝试在计算机 1 上启动应用程序 (npm start) 时,它不起作用。

Error : The app tries to connect to the db but fails.
 MongoTimeoutError: Server selection timed out after 30000 ms
    at Timeout.setTimeout [as _onTimeout] (C:\Users\marin\Documents\Code\Codecademy\Site\Travel-kit\node_modules\mongodb\lib\core\sdam\topology.js:897:9)
    at ontimeout (timers.js:436:11)
    at tryOnTimeout (timers.js:300:5)
    at listOnTimeout (timers.js:263:5)
    at Timer.processTimers (timers.js:223:10)
  name: 'MongoTimeoutError',
  reason:
    Error: getaddrinfo ENOTFOUND http http:27017
       at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:56:26)
     name: 'MongoNetworkError',
     errorLabels: [ 'TransientTransactionError' ],
     [Symbol(mongoErrorContextSymbol)]:  ,
  [Symbol(mongoErrorContextSymbol)]:  

-> Mongo 服务正在计算机 2 上运行。我可以在本地启动 db 和应用程序。一切正常。 -> 隧道创建正常工作。如果我尝试创建一个端口为 3000 的隧道并在计算机 2 上运行 nodejs,我可以从计算机 1 发送请求并正常获取结果。

问题似乎在于我尝试直接连接到数据库的方式。

**** 已解决

问题是 MongoDB 使用 tcp 而不是 http,所以我唯一改变的就是创建一个隧道使用:

ngrok tcp 27017

【问题讨论】:

试试这个ngrok http 27017,你需要暴露端口号27017才能在其他计算机上使用它。避免添加本地主机 我试过了,我得到了同样的错误原因:错误:连接ECONNREFUSED XX.XXX.XX.XXX:27017 【参考方案1】:

我自己解决了这个问题。

问题是 MongoDB 使用 tcp 而不是 http,所以我唯一改变的就是创建一个隧道使用:

ngrok tcp 27017

【讨论】:

以上是关于使用 ngrok 创建隧道以连接到 MongoDB 本地数据库的主要内容,如果未能解决你的问题,请参考以下文章

连接到 *** 时如何使用 ngrok 进行隧道传输?

无法将 dialogflow webhook 链接到 ngrok 隧道

为啥我不能使用 serveo 而不是 ngrok 来隧道连接到托管在 EC2 服务器上的 mvc 应用程序以在 Twilio 上接收 SMS

使用 Ngrok 从 AWS Lambda 连接到本地 PostgreSQL

如何在 C# Socket 中使用 ngrok tcp 隧道

Ngrok:带有自定义域的“找不到隧道”