从firebase函数连接到MongoDB Atlas

时间:2018-05-16 04:50:01

标签: node.js mongodb firebase google-cloud-functions mongodb-atlas

我正在尝试从firebase函数连接到mongodb atlas。

export default async () => {
  try {
    const url = 'mongodb+srv://foo:bar@foo-cluster.mongodb.net/my-db?retryWrites=true';
    const client = await MongoClient.connect(url);
    client.dbName('my-db');
    return client;
  } catch (e) {
    throw e;
  }
}

但是,我收到此错误:

  

{       "代码":" ESERVFAIL",       " errno":" ESERVFAIL",       "系统调用":" querySrv",       "主机名":" _mongodb._tcp.foo-cluster.mongodb.net"   }

  1. 我确保将我的firebase计划设置为Blaze,以便我可以连接到Google网络之外的任何客户端。
  2. 我将功能列入白名单'在mongodb atlas仪表板中的IP,我还添加了#34;来自任何地方的连接"只是为了确保。
  3. 我使用的是nodejs mongo驱动程序版本^3.1.0-beta4
  4. 有什么想法?感谢。

3 个答案:

答案 0 :(得分:0)

从Firebase Function连接到Atlas时需要注意的地方很少。以下是返回已连接的客户端实例以在FB函数中进一步使用的正确方法:

import { MongoClient } from 'mongodb'

const uri = 'mongodb://<USER>:<PASSWORD>@foo-shard-00-00-xxx.gcp.mongodb.net:27017,foo-shard-00-01-xxx.gcp.mongodb.net:27017,foo-shard-00-02-xxx.gcp.mongodb.net:27017/test?ssl=true&replicaSet=FOO-shard-0&authSource=admin&retryWrites=true'

let client

export default async () => {

    if (client && client.isConnected()) {
        console.log('DB CLIENT ALREADY CONNECTED')

    } else try {
        client = await MongoClient.connect(uri, { useNewUrlParser: true })
        console.log('DB CLIENT RECONNECTED')
    }

    catch (e) {
    throw e
    }

    return client
}

说明:

  1. 据报道,如果您使用的是 Spark 计划,则无法连接到Atlas。如果尚未升级,请确保升级到Blaze。

  2. uri字符串–从Firebase连接到Atlas时,不应使用缩短的url格式。由于某些原因,只有较旧的长网址格式才能在Firebase中可靠地工作。

  3. client变量–您应该在导出范围之外定义client变量,然后仅在尚未分配连接的客户端实例的情况下在函数中为其分配变量。这将防止在每次函数调用时重新连接客户端。 Firebase函数是 lessstate ,但不是全部。他们只有在一段时间不活动后才会关闭。这意味着连接将持续一段时间。 From docs:如果您在全局范围内声明变量,则其值可以在后续调用中重用,而不必重新计算。

答案 1 :(得分:0)

就我而言,我的mongodb Atlas群集的网络访问规则不允许Firebase函数访问数据库。

答案 2 :(得分:0)

为了解决这个问题,我做到了:

  • 为您的项目启用结算,它将自动为您的应用启用出站网络请求。

出站网络请求免费,每月最高5GB。因此,只需启用计费即可享用。

有关此处的结算的更多信息。 https://firebase.google.com/pricing#blaze-calculator