Il y a quelques mises en garde lors de la connexion à Atlas à partir de Firebase Function. Vous trouverez ci-dessous la manière correcte de renvoyer une instance client connectée pour une utilisation ultérieure dans votre fonction 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
}
Explication :
-
apparemment, vous ne pouvez pas vous connecter à Atlas si vous êtes sur un Spark planifier. Assurez-vous de passer à Blaze si vous ne l'avez pas encore fait.
-
uri
chaîne - Vous ne devez pas utiliser le format d'URL raccourci lors de la connexion à Atlas à partir de Firebase. Pour une raison quelconque, seul l'ancien format d'URL longue fonctionne de manière fiable à partir de Firebase. -
client
variable – Vous devez définir leclient
variable en dehors de la portée de l'exportation, puis affectez-lui l'instance de client connectée dans la fonction, uniquement si elle n'est pas déjà affectée. Cela empêchera de reconnecter le client à chaque invocation de fonction. Les fonctions Firebase sont sans état , mais pas entièrement. ils ne s'arrêtent qu'après une certaine période d'inactivité. Cela signifie que la connexion persistera pendant un certain temps. À partir de la documentation :Si vous déclarez une variable en portée globale, sa valeur pourra être réutilisée lors d'invocations ultérieures sans avoir à être recalculée.