从Google Cloud Functions控制台访问MongoDB Atlas Cluster

问题描述 投票:3回答:2

我正在编写一个基本的Google Cloud功能,它将从MongoDB Atlas查询MongoDB群集。我正在写入Google控制台,我确定将“mongodb”:“^ 3.0.2”添加到package.json文件中的依赖项中。

这是函数(为了安全起见,我在uri中替换了有效密码等):

/**
* Responds to any HTTP request that can provide a "message" field in the 
body.
 *
 * @param {!Object} req Cloud Function request context.
 * @param {!Object} res Cloud Function response context.
 */
exports.myPackage = (req, res) => {    
  var MongoClient = require('mongodb').MongoClient;
  var uri = "mongodb+srv://<USERNAME>:<PASSWORD>@<CLUSTER-NAME>-vtbhs.mongodb.net/test";
  MongoClient.connect(uri, function(err, client) {
    if (err) {
      console.log('err');
      console.log(err);
    } else {
      const collection = client.db("test").collection("devices");
    }
  });

  res.status(200).send('Success');
}

我确定驱动程序是最新的,我直接从Atlas文档中复制了大部分代码。我已将Atlas的所有IP列入白名单进行测试。

每次运行该函数时,我都会在connect回调中收到以下错误:

"{ Error: querySrv ESERVFAIL _mongodb._tcp.<CLUSTER-NAME>-vtbhs.mongodb.net
at errnoException (dns.js:28:10)
at QueryReqWrap.onresolve [as oncomplete] (dns.js:219:19)
code: 'ESERVFAIL',
errno: 'ESERVFAIL',
syscall: 'querySrv',
hostname: '_mongodb._tcp.<CLUSTER-NAME>-vtbhs.mongodb.net' }"

我以前也遇到过如下错误:

URI does not have hostname, domain name and tld at module.exports

虽然我在Mongo中调整了密码后似乎不再出现(可能在其中有一个非html编码的字符)。

在此先感谢您的帮助!

node.js mongodb google-cloud-platform google-cloud-functions mongodb-atlas
2个回答
14
投票

我有完全相同的问题。在运行firebase deploy之后,MongoDB Atlas和mLab连接都失败了,但是使用firebase serve在本地工作。

我相信有两个问题:

  1. 免费Spark计划禁用出站网络。你必须升级到Blaze计划(即用即付)才能做到这一点。我只是换了层,现在就可以了。

Spark计划仅允许出站网络请求到Google拥有的服务。配额内允许入站调用请求。在Blaze计划中,云功能提供永久免费套餐。每月免费提供前2,000,000次调用,400,000 GB-sec,200,000 CPU-sec和5 GB Internet出口流量。您只需支付超过此免费分配的使用费。定价基于调用总数和计算时间。计算时间可根据为函数配置的内存量和CPU量而变化。使用限制也通过每日和100s配额强制执行。有关更多信息,请参阅云功能定价。

https://firebase.google.com/pricing/

你必须提供一张信用卡,但只要你保持在他们的数据配额之下,显然你不会被收费。我会尝试一下,看看它是怎么回事。

  1. 升级后,您的MongoDB Atlas连接可能仍然失败(而mLab字符串可以正常工作)。这是因为您的查询URI使用的是Mongo 3.6 SRV地址,而不是Mongo 3.4驱动程序的“mongodb://”协议。尝试切换驱动程序版本,看看它是否有效。 enter image description here

0
投票

尝试issuing HTTP requestsquery MongoDB。云功能仅允许HTTP / S出站流量。

© www.soinside.com 2019 - 2024. All rights reserved.