MongoClient не удалось подключиться к серверу при первом подключении, но подключается позже - PullRequest
0 голосов
/ 22 мая 2018

Я очень озадачен тем, как MongoClient.connect предполагается использовать.У меня есть экспресс-приложение, которое использует MongoDB, и я работаю над его развертыванием с помощью Docker.При использовании docker-compose up приложение может попытаться подключиться к mongo до того, как mongo будет готово принимать подключения.Когда это происходит, я получаю следующую ошибку:

MongoNetworkError: failed to connect to server [mongo:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 172.18.0.2:27017]

Это нормально, но фактически подключается, как только база данных становится доступной.Это также было бы хорошо, но обещание уже отклонено, и у меня нет возможности использовать это соединение.Я также попытался переключиться на использование обратных вызовов, но после сбоя обратный вызов больше не вызывается.

Я всегда могу повторить попытку, пока не получу рабочее соединение без ошибки, но каждый раз, когда я повторяюсь, я получаю другое соединениев базу данных, которая не закрыта до перезапуска приложения, что обычно происходит при развертывании новой версии.

Мне либо нужен способ использовать соединение, которое изначально не удалось, либо остановить повторные попытки неудачных соединений.Кто-нибудь знает, как это сделать?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Если вы запускаете все свои контейнеры одновременно, контейнер MongoDB может быть недоступен до контейнера вашего приложения.

Вы можете Управлять порядком запуска в Compose , чтобы гарантировать, что MongoDBcontainer up перед контейнером приложения, например, с помощью директивы depends_on.Из примера на связанной странице:

version: "2"
services:
  web:
    build: .
    ports:
      - "80:8000"
    depends_on:
      - "db"
    command: ["./wait-for-it.sh", "db:5432", "--", "python", "app.py"]
  db:
    image: mongodb

Однако обратите внимание, что, как упомянуто в документации disabled_on , это не полное решение, поскольку оно ожидает только до запуска контейнера, а необязательно, пока база данных не будет запущена.

Вам потребуется использовать depends_on в сочетании со сценарием вроде wait-for-it , чтобы убедиться, что база данных действительно запущена.

0 голосов
/ 22 мая 2018

Версия 3.0 драйвера Node.js MongoDB дает вам некоторую дополнительную гибкость, поскольку вы можете создать свой собственный объект MongoClient и использовать его методы для подключения, проверьте, все еще ли вы подключены,и отключите при необходимости:

let mc = new mongodb.MongoClient('mongodb://localhost');

await mc.connect();

if (mc.isConnected()) { ... }

let db = mc.db('test');
let collection = db.collection("test");

...

await mc.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...