cPanel Node.js应用程序无法连接到MongoDB Atlas集群,但可以在Heroku上运行

时间:2020-06-25 08:19:05

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

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

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

enter image description here

我将检出的存储库用作应用程序根目录,配置了所有环境变量(未在图片上显示)并执行了NPM安装。

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

这是我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文件中的engine字段而没有结果。

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

我不知道该在哪里寻找什么,尤其是在Heroku上运行我的应用程序时没有任何问题。 这使我认为问题可能出在cPanel设置内。由于代码和所有内容都是相同的,因此这与Heroku最为明显,后者不存在cPanel。也许有些安全设置阻止了我在cPanel内部建立连接。

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

相关问题