Есть несколько предостережений при подключении к Atlas из Firebase Function. Ниже приведен правильный способ вернуть подключенный экземпляр клиента для дальнейшего использования в вашей функции 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
}
Пояснение:
как сообщается, вы не можете подключиться к Atlas, если вы находитесь на Spark плане. Убедитесь, что вы обновились до Blaze, если вы еще этого не сделали.
uri
string - Вы не должны использовать сокращенный формат URL при подключении к Atlas из Firebase. По какой-то причине, только более ранний формат длинных URL-адресов надежно работает с firebase.
client
переменная - вы должны определить переменную client
вне области экспорта, а затем назначить ему подключенный экземпляр клиента внутри функции, только если она еще не назначена. Это предотвратит переподключение клиента при каждом вызове функции. Функции Firebase не сохраняют состояние , но не полностью. они отключаются только после некоторого периода бездействия. Это означает, что соединение будет сохраняться в течение некоторого времени. Из документов : Если вы объявляете переменную в глобальной области видимости, ее значение можно повторно использовать в последующих вызовах без необходимости повторного вычисления.