【问题标题】:Nodejs not able to connect to mongodb on cloud shellNodejs无法连接到云外壳上的mongodb
【发布时间】:2019-01-02 02:13:07
【问题描述】:

我的 MongoDB 服务器托管在 google-cloud VM 上。我希望创建 App Engine 微服务。测试连通性,

我的 server.js 看起来像

const MongoClient = require('mongodb').MongoClient;
const test = require('assert');
// Connection url
const url = 'mongodb://testmongodb:27017';
// Database Name
const dbName = 'test';
// Connect using MongoClient
MongoClient.connect(url, { useNewUrlParser: true },function(err, client) {
if(err){console.log(err)}
else {console.log("Connected successfully")}
});

如果我通过另一个虚拟机连接,它会完美运行。但在尝试通过 Google Cloud Shell 执行 (npm start) 相同的代码时不起作用。我收到错误

{ MongoNetworkError: failed to connect to server [testmongodb:27017] on first connect [MongoNetworkError: getaddrinfo ENOTFOUND testmongodb testmongodb:27017]
    at Pool.<anonymous> (/home/google/mng/node_modules/mongodb-core/lib/topologies/server.js:562:11)
    at emitOne (events.js:116:13)
    at Pool.emit (events.js:211:7)
    at Connection.<anonymous> (/home/google/mng/node_modules/mongodb-core/lib/connection/pool.js:316:12)
    at Object.onceWrapper (events.js:317:30)
    at emitTwo (events.js:126:13)
    at Connection.emit (events.js:214:7)
    at Socket.<anonymous> (/home/google/mng/node_modules/mongodb-core/lib/connection/connection.js:245:50)
    at Object.onceWrapper (events.js:315:30)
    at emitOne (events.js:116:13)
  name: 'MongoNetworkError',
  message: 'failed to connect to server [testmongodb:27017] on first connect [MongoNetworkError: getaddrinfo ENOTFOUND testmongodb testmongodb:27017]',
  errorLabels: [ 'TransientTransactionError' ],
  [Symbol(mongoErrorContextSymbol)]: {} }

我在部署服务 [gcloud app deploy] 时遇到完全相同的错误

请帮忙。

【问题讨论】:

  • 在 mongod.conf 上,将 bindip 的设置更改为 0.0.0.0
  • 防火墙设置改为开放端口27017
  • 请帮我理解一下,什么是“testmongodb”?是虚拟网络中vm的名字吗?
  • 是的,它是我的 mongodb 所在的 VM 的主机名。它在同一个虚拟网络中
  • 酷。我猜如果两台服务器都在同一个虚拟机中,使用 localhost 而不是 hostnname 应该可以工作。

标签: node.js mongodb google-app-engine google-cloud-platform microservices


【解决方案1】:

App Engine Standard 确实支持使用您使用的相同库连接到 MongoDB 实例。 This example 也适用于标准和灵活。

问题在于您的连接方式。您必须像这样创建 URI:

let uri = `mongodb://${user}:${pass}@${host}:${port}`;

在你的代码中,你有这个:

const url = 'mongodb://testmongodb:27017';

您的 URI 中缺少用户名和密码(假设 testmongodb 是您的主机名)。

【讨论】:

  • 我也尝试了通过 db.createuser() 创建的用户,但它不起作用,然后我玩了 app.yaml,从将标准更改为 flex 并从 flex 回到标准。它仅在未提及 flex 时才有效。可能是我做错了什么。我可以pm你吗?
  • 如果您的 app.yaml 文件中没有指定环境,则默认为标准环境。所以,你是说“它只有在没有提到 flex 时才有效”,所以它确实在标准中有效。
【解决方案2】:

当连接到同一台机器上的服务器时,使用 mongodb://localhost:27017。

【讨论】:

  • 是的,在同一台机器上它可以工作(并且可以工作)。关键是当我在 google App Engine 中部署服务时。不起作用。因此它必须有一个合格的主机名
【解决方案3】:

感谢大家的支持和回答。

似乎我需要在我的app.yaml 文件中进行更改。
env: standard 不支持 mongodb。你将不得不使用 env: flex 在您的 yaml 文件中,gcloud app deploy app.yaml 命令将使用该文件

【讨论】:

  • 这是不正确的,因为 MongoDB 在 Standard 中支持与您使用的完全相同的库。检查我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 2020-09-13
  • 2021-06-29
  • 2023-02-07
  • 2021-06-25
  • 2019-01-12
相关资源
最近更新 更多