Hay algunas advertencias al conectarse a Atlas desde Firebase Function. A continuación se muestra la forma correcta de devolver una instancia de cliente conectada para su uso posterior en su función 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
}
Explicación:
-
según se informa, no puede conectarse a Atlas si está en un Spark plan. Asegúrate de actualizar a Blaze si aún no lo hiciste.
-
uri
cadena:no debe usar el formato de URL abreviado cuando se conecta a Atlas desde Firebase. Por alguna razón, solo el formato de URL largo más antiguo funciona de manera confiable desde firebase. -
client
variable:debe definir elclient
variable fuera del ámbito de exportación y, a continuación, asígnele la instancia de cliente conectada dentro de la función, solo si aún no está asignada. Esto evitará volver a conectar al cliente en cada invocación de función. Las funciones de Firebase son sin estado , pero no del todo. solo se apagan después de un período de inactividad. Esto significa que la conexión persistirá durante algún tiempo. De documentos :si declara una variable en ámbito global, su valor se puede reutilizar en invocaciones posteriores sin tener que volver a calcularlo.