从 firebase 函数连接到 MongoDB Atlas

CEN*_*EDE 5 mongodb node.js 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,我收到此错误:

{ "code": "ESERVFAIL", "errno": "ESERVFAIL", "syscall": "querySrv", "hostname": "_mongodb._tcp.foo-cluster.mongodb.net" }

  1. 我确保我的 firebase 计划设置为 Blaze,以便我可以连接到 google 网络之外的任何客户端。
  2. 我在 mongodb atlas 仪表板中将函数的 IP 列入白名单,我还添加了“从任何地方连接”只是为了确保。
  3. 我正在使用 nodejs mongo 驱动程序版本 ^3.1.0-beta4

有什么想法吗?谢谢。

Jan*_*lak 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
}
Run Code Online (Sandbox Code Playgroud)

解释:

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

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

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