5

我正在尝试从 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,这样我就可以连接到谷歌网络之外的任何客户端。
  2. 我在 mongodb atlas 仪表板中将函数的 IP 列入白名单,我还添加了“从任何地方连接”以确保。
  3. 我正在使用 nodejs mongo 驱动程序版本^3.1.0-beta4

有什么想法吗?谢谢。

4

3 回答 3

8

从 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,请确保升级到 Blaze。

  2. uristring – 从 Firebase 连接到 Atlas 时,不应使用缩短的 url 格式。出于某种原因,只有较旧的长 url 格式可以在 firebase 中可靠地工作。

  3. client变量 - 您应该client在导出范围之外定义变量,然后在函数内部将连接的客户端实例分配给它,前提是它尚未分配。这将防止在每次函数调用时重新连接客户端。Firebase 函数是无状态的,但并非完全无状态。他们只有在一段时间不活动后才会关闭。这意味着连接将持续一段时间。来自 docs:如果您在全局范围内声明变量,则其值可以在后续调用中重用,而无需重新计算。

于 2018-12-31T15:22:37.983 回答
1

就我而言,我的 mongodb atlas 集群的网络访问规则不允许 firebase 功能访问数据库。我必须允许从任何地方访问才能使其正常工作。

于 2019-10-17T03:03:49.720 回答
1

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

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

出站网络请求最多可免费使用 5gb/月。因此,只需启用计费并享受。

有关帐单的更多信息在这里。 https://firebase.google.com/pricing#blaze-calculator

于 2019-11-12T16:20:15.793 回答