Det finns få förbehåll när du ansluter till Atlas från Firebase Function. Nedan är det korrekta sättet att returnera en ansluten klientinstans för vidare användning i din FB-funktion:
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
}
Förklaring:
-
enligt uppgift kan du inte ansluta till Atlas om du är på en Spark planen. Se till att du uppgraderar till Blaze om du inte har gjort det ännu.
-
uri
sträng – Du bör inte använda det förkortade url-formatet när du ansluter till Atlas från Firebase. Av någon anledning fungerar bara det äldre, långa url-formatet tillförlitligt från firebase. -
client
variabel – Du bör definieraclient
variabel utanför exportomfånget, och tilldela sedan den anslutna klientinstansen till den inuti funktionen, endast om den inte redan är tilldelad. Detta kommer att förhindra att klienten återansluts vid varje funktionsanrop. Firebase-funktioner är tillståndslösa , men inte helt. de stängs bara av efter en period av inaktivitet. Det betyder att anslutningen kommer att bestå under en tid. Från dokument :Om du deklarerar en variabel i globalt omfång kan dess värde återanvändas i efterföljande anrop utan att behöva beräknas om.