【问题标题】:cPanel Node.js app cannot connect to MongoDB Atlas cluster but works on HerokucPanel Node.js 应用程序无法连接到 MongoDB Atlas 集群,但可以在 Heroku 上运行
【发布时间】:2020-10-15 15:35:20
【问题描述】:

我使用 Node.js 创建了一个网站,该网站使用 MongoDB Atlas 集群作为其数据库。 到目前为止,我在 Heroku 上托管并测试了所有我没有任何问题的东西。

2 天前,我终于决定购买我想要的域名并支付适当的托管费用。 我在主机服务器上检查了我的 Git 存储库,并使用 cPanel -> Software -> Setup Node.js App 工具让我的网站上线。

我使用我签出的存储库作为应用根目录,配置了所有环境变量(不在图片上)并执行了 NPM 安装。

但由于某种原因,我无法建立与我的 MongoDB 数据库的连接,即使我将每个 IP 地址 (0.0.0.0/0) 都列入了白名单。

这是我的 app.js 中的代码

const connectionString = 'mongodb+srv://' + process.env.MONGODB_USER + ':' + process.env.MONGODB_PW + '@<REDACTED_APP>-y1llv.mongodb.net/<REDACTED_APP>';
mongoose
    .connect(connectionString, {
    useUnifiedTopology: true,
    useNewUrlParser: true,
    useFindAndModify: false
    })
    .then(() => console.log('Database connected.'))
    .catch(err => console.log(err));

当我启动我的应用程序并打开 URL 时,我收到此错误:

App 793847 output: Server has started successfully.
App 793847 output: MongooseServerSelectionError: Could not connect to any servers in your MongoDB Atlas cluster. One common reason is that you're trying to access the database from an IP that isn't whitelisted. Make sure your current IP address is on your Atlas cluster's IP whitelist: https://docs.atlas.mongodb.com/security-whitelist/
App 793847 output:     at NativeConnection.Connection.openUri (/home/<REDACTED_USER>/nodevenv/repositories/<REDACTED_APP>/12/lib/node_modules/mongoose/lib/connection.js:830:32)
App 793847 output:     at Mongoose.connect (/home/<REDACTED_USER>/nodevenv/repositories/<REDACTED_APP>/12/lib/node_modules/mongoose/lib/index.js:335:15)
App 793847 output:     at Object.<anonymous> (/home/<REDACTED_USER>/repositories/<REDACTED_APP>/app.js:29:6)
App 793847 output:     at Module._compile (internal/modules/cjs/loader.js:936:30)
App 793847 output:     at Object.Module._extensions..js (internal/modules/cjs/loader.js:947:10)
App 793847 output:     at Module.load (internal/modules/cjs/loader.js:790:32)
App 793847 output:     at Function.Module._load (internal/modules/cjs/loader.js:703:12)
App 793847 output:     at Module.require (internal/modules/cjs/loader.js:830:19)
App 793847 output:     at Module.require (/opt/passenger-5.3.7-5.el6.cloudlinux/src/helper-scripts/node-loader.js:80:25)
App 793847 output:     at require (internal/modules/cjs/helpers.js:68:18)
App 793847 output:     at loadApplication (/opt/passenger-5.3.7-5.el6.cloudlinux/src/helper-scripts/node-loader.js:243:2)
App 793847 output:     at setupEnvironment (/opt/passenger-5.3.7-5.el6.cloudlinux/src/helper-scripts/node-loader.js:214:2)
App 793847 output:     at Object.<anonymous> (/opt/passenger-5.3.7-5.el6.cloudlinux/src/helper-scripts/node-loader.js:133:1)
App 793847 output:     at Module._compile (internal/modules/cjs/loader.js:936:30)
App 793847 output:     at Object.Module._extensions..js (internal/modules/cjs/loader.js:947:10)
App 793847 output:     at Module.load (internal/modules/cjs/loader.js:790:32) {
App 793847 output:   message: "Could not connect to any servers in your MongoDB Atlas cluster. One common reason is that you're trying to access the database from an IP that isn't whitelisted. Make sure your current IP address is on your Atlas cluster's IP whitelist: https://docs.atlas.mongodb.com/security-whitelist/",
App 793847 output:   reason: TopologyDescription {
App 793847 output:     type: 'ReplicaSetNoPrimary',
App 793847 output:     setName: null,
App 793847 output:     maxSetVersion: null,
App 793847 output:     maxElectionId: null,
App 793847 output:     servers: Map {
App 793847 output:       '<REDACTED_APP>-shard-00-00-y1llv.mongodb.net:27017' => [ServerDescription],
App 793847 output:       '<REDACTED_APP>-shard-00-02-y1llv.mongodb.net:27017' => [ServerDescription],
App 793847 output:       '<REDACTED_APP>-shard-00-01-y1llv.mongodb.net:27017' => [ServerDescription]
App 793847 output:     },
App 793847 output:     stale: false,
App 793847 output:     compatible: true,
App 793847 output:     compatibilityError: null,
App 793847 output:     logicalSessionTimeoutMinutes: null,
App 793847 output:     heartbeatFrequencyMS: 10000,
App 793847 output:     localThresholdMS: 15,
App 793847 output:     commonWireVersion: null
App 793847 output:   }
App 793847 output: }

经过一番搜索,我发现有些人在他们的连接选项中使用 useUnifiedTopology 标志时遇到问题。当我将其注释掉时,我会收到此错误:

App 811175 output: Server has started successfully.
App 811175 output: (node:811175) DeprecationWarning: current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. To use the new Server Discover and Monitoring engine, pass option { useUnifiedTopology: true } to the MongoClient constructor.
App 811175 output: MongoNetworkError: failed to connect to server [<REDACTED_APP>-shard-00-00-y1llv.mongodb.net:27017] on first connect [Error: connect ECONNREFUSED <REDACTED_IP>:27017
App 811175 output:     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1056:14) {
App 811175 output:   name: 'MongoNetworkError'
App 811175 output: }]
App 811175 output:     at Pool.<anonymous> (/home/<REDACTED_USER>/nodevenv/repositories/<REDACTED_APP>/12/lib/node_modules/mongodb/lib/core/topologies/server.js:438:11)
App 811175 output:     at Pool.emit (events.js:209:13)
App 811175 output:     at /home/<REDACTED_USER>/nodevenv/repositories/<REDACTED_APP>/12/lib/node_modules/mongodb/lib/core/connection/pool.js:562:14
App 811175 output:     at /home/<REDACTED_USER>/nodevenv/repositories/<REDACTED_APP>/12/lib/node_modules/mongodb/lib/core/connection/pool.js:1009:9
App 811175 output:     at /home/<REDACTED_USER>/nodevenv/repositories/<REDACTED_APP>/12/lib/node_modules/mongodb/lib/core/connection/connect.js:31:7
App 811175 output:     at callback (/home/<REDACTED_USER>/nodevenv/repositories/<REDACTED_APP>/12/lib/node_modules/mongodb/lib/core/connection/connect.js:264:5)
App 811175 output:     at TLSSocket.<anonymous> (/home/<REDACTED_USER>/nodevenv/repositories/<REDACTED_APP>/12/lib/node_modules/mongodb/lib/core/connection/connect.js:294:7)
App 811175 output:     at Object.onceWrapper (events.js:297:20)
App 811175 output:     at TLSSocket.emit (events.js:209:13)
App 811175 output:     at emitErrorNT (internal/streams/destroy.js:91:8)
App 811175 output:     at emitErrorAndCloseNT (internal/streams/destroy.js:59:3)
App 811175 output:     at processTicksAndRejections (internal/process/task_queues.js:77:11) {
App 811175 output:   name: 'MongoNetworkError'
App 811175 output: }

我认为这不是问题,但我可以在 cPanel 工具中配置的最新 Node.js 版本是 12.9.0,而我的应用程序使用的是 12.16.2。我仍然尝试更改 package.json 文件中的引擎字段,但没有结果。

我还注意到“服务器已成功启动。”日志仅在我打开 URL 后出现在我的乘客日志文件中,而不是在我启动应用程序时立即出现(当我在 app.js 中调用 'app.listen(port)' 时会记录它)。

我不知道该去哪里或寻找什么了,尤其是因为我在 Heroku 上运行我的应用程序没有任何问题。 这让我认为问题可能出在 cPanel 设置中的某个地方。由于代码和一切都相同,这是与 Heroku 最明显的区别,Heroku 不存在 cPanel。也许有一些安全设置阻止我在 cPanel 中建立连接。

我真的希望这里有人知道如何解决这个问题:)

【问题讨论】:

  • 嘿,你能让它工作吗?我无法在 Mongodb Atlas 中将我的服务器列入白名单
  • @Zak 很遗憾还没有。我会在周一尝试联系 MongoDB 支持。我希望他们至少可以为我指明某个方向,以获取有关我为什么会收到此 MongoNetworkError 的更多信息。为什么不能将您的服务器列入白名单?
  • 我有点忘了在 mongoose.connect 中包含“then catch”块。现在它似乎可以连接,但我无法访问我的数据库,也无法访问我的网站。出了点问题。您可以与您的主机支持人员交谈。他们帮助我完成了港口。不知道这是不是问题之一。不过试试看吧。
  • @Zak 非常感谢,这就是我今天所做的!他们不得不打开 27017 端口,现在一切似乎都对我有用。很抱歉听到您的问题。如果您无法连接但端口已打开,这听起来像是白​​名单问题,但我想您会想到这一点。您是否有包含任何特定错误的日志文件,可以提供更多洞察力?
  • 我很高兴你能成功。不,我在日志文件中没有看到任何其他错误。我不知道问题是什么或在哪里。我在这里开了一个帖子。你能看一下,也许你能用我的代码弄清楚吗?这是链接:stackoverflow.com/questions/62623375/…

标签: node.js mongodb mongoose cpanel mongodb-atlas


【解决方案1】:

我也联系了他们。 他们不得不打开端口 27017 3000 80 443

【讨论】:

  • 嘿兄弟,你让它在 Namecheap 的共享主机包中工作了吗?
  • 是的,这是一个共享主机包
  • 他们没有打开我的共享包中的端口,告诉我出于安全原因这是不可能的。奇怪!
  • 好吧,我想你必须确保你是真正的所有者。这样他们就可以帮助你做到这一点。我对共享主机的理解就像在一个主机包中托管两个或三个网站。所以基本上,正如我之前所说,你必须确认你是包的所有者。然后告诉他们打开端口。如果您有任何问题,请随时提出。
  • @TayyabFerozi,我没有告诉他们是入站还是出站。但是打开端口将使您的 Mongodb 集群与您的应用程序建立连接。
【解决方案2】:

我联系了我的主机支持,他们为我打开了 27017 端口。现在一切正常!我要大喊一声,Namecheap 有很棒的实时聊天支持员工。他们查看了我的日志文件和所有内容,并且非常耐心。

【讨论】:

  • 您好我正在使用ventraIP托管,他们没有为我打开端口,他们说我们可以将入站或出站的IP地址列入白名单。我现在该怎么办,对不起,如果我觉得自己很笨,我对网络了解不多。提前致谢
  • 如果他们可以为您打开端口,请告诉他们打开端口 27017 3000 80 443。
猜你喜欢
  • 2022-01-18
  • 2019-12-16
  • 1970-01-01
  • 2019-06-10
  • 2022-08-02
  • 2019-12-14
  • 2021-10-02
  • 2018-03-05
  • 2021-06-30
相关资源
最近更新 更多