Подключение к MongoDB Atlas из функций Firebase - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь подключиться к атласу mongodb с помощью таких функций, как Firebase.

export default async () => {
  try {
    const url = 'mongodb+srv://foo:bar@foo-cluster.mongodb.net/my-db?retryWrites=true';
    const client = await MongoClient.connect(url);
    client.dbName('my-db');
    return client;
  } catch (e) {
    throw e;
  }
}

Однако я получаю эту ошибку:

{"code": "ESERVFAIL", "errno": "ESERVFAIL", "syscall": "querySrv", "hostname": "_mongodb._tcp.foo-cluster.mongodb.net"}

  1. Я убедился, что мой план Firebase установлен на Blaze, поэтому я могу подключиться к любому клиенту за пределамииз сети Google.
  2. Я внес белый список IP-адресов функций в панель управления mongodb atlas, я также добавил «подключение отовсюду» просто для уверенности.
  3. Я использую версию драйвера nodejs mongo ^3.1.0-beta4

Есть мысли?Спасибо.

1 Ответ

0 голосов
/ 31 декабря 2018

Есть несколько предостережений при подключении к 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
}

Пояснение:

  1. как сообщается, вы не можете подключиться к Atlas, если вы находитесь на Spark плане. Убедитесь, что вы обновились до Blaze, если вы еще этого не сделали.

  2. uri string - Вы не должны использовать сокращенный формат URL при подключении к Atlas из Firebase. По какой-то причине, только более ранний формат длинных URL-адресов надежно работает с firebase.

  3. client переменная - вы должны определить переменную client вне области экспорта, а затем назначить ему подключенный экземпляр клиента внутри функции, только если она еще не назначена. Это предотвратит переподключение клиента при каждом вызове функции. Функции Firebase не сохраняют состояние , но не полностью. они отключаются только после некоторого периода бездействия. Это означает, что соединение будет сохраняться в течение некоторого времени. Из документов : Если вы объявляете переменную в глобальной области видимости, ее значение можно повторно использовать в последующих вызовах без необходимости повторного вычисления.

...