我正在尝试从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" }
^3.1.0-beta4
有什么想法?感谢。
答案 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
}
说明:
据报道,如果您使用的是 Spark 计划,则无法连接到Atlas。如果尚未升级,请确保升级到Blaze。
uri
字符串–从Firebase连接到Atlas时,不应使用缩短的url格式。由于某些原因,只有较旧的长网址格式才能在Firebase中可靠地工作。
client
变量–您应该在导出范围之外定义client
变量,然后仅在尚未分配连接的客户端实例的情况下在函数中为其分配变量。这将防止在每次函数调用时重新连接客户端。 Firebase函数是 lessstate ,但不是全部。他们只有在一段时间不活动后才会关闭。这意味着连接将持续一段时间。 From docs:如果您在全局范围内声明变量,则其值可以在后续调用中重用,而不必重新计算。
答案 1 :(得分:0)
就我而言,我的mongodb Atlas群集的网络访问规则不允许Firebase函数访问数据库。
答案 2 :(得分:0)
为了解决这个问题,我做到了:
出站网络请求免费,每月最高5GB。因此,只需启用计费即可享用。
有关此处的结算的更多信息。 https://firebase.google.com/pricing#blaze-calculator