我正在尝试从 firebase 函数连接到 mongodb atlas,例如。
export default async () => {
try {
const url = 'mongodb+srv://foo:[email protected] /cdn-cgi/l/email-protection/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”
}
- 我确保我的 firebase 计划设置为 Blaze,这样我就可以连接到 google 网络之外的任何客户端。
- 我在 mongodb atlas 仪表板中将函数的 IP 列入白名单,我还添加了“从任何地方连接”以确保。
- 我使用的是nodejs mongo驱动版本
^3.1.0-beta4
有什么想法吗?谢谢。
从 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计划。如果您尚未升级到 Blaze,请务必升级到 Blaze。
uri
string – 从 Firebase 连接到 Atlas 时不应使用缩短的 url 格式。由于某种原因,只有旧的长 url 格式才能在 firebase 中可靠地工作。
client
变量 – 您应该定义client
变量在导出范围之外,然后在函数内部将连接的客户端实例分配给它(仅当尚未分配时)。这将防止在每次函数调用时重新连接客户端。 Firebase 功能有无国籍的,但不完全是。它们只会在一段时间不活动后才会关闭。这意味着连接将持续一段时间。来自文档 https://cloud.google.com/functions/docs/bestpractices/tips#use_dependencies_wisely:如果在全局范围内声明变量,则其值可以在后续调用中重用,而无需重新计算。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)