Ошибка MongoServerSelectionError: getaddrinfo ENOTFOUND 944ef754a755

#node.js #mongodb

Вопрос:

У меня есть тестовая среда, использующая JUnit 5, в которой я запускаю MongoDB в контейнере Docker. Это делается в @BeforeAll функции моего набора тестов. У меня есть тест на подключение к MongoDB, написание и чтение документа, и он отлично работает.

После того, как я запустил контейнер Docker, я начинаю свой Node.js служба в том же @BeforeAll коде, и я передаю URI Mongo, например mongodb://localhost:55021 , через файл в файловой системе. Я убедился, что мой Node.js служба правильно получает URI.

Однако, по моему Node.js сервис, когда я пытаюсь подключиться к MongoDB, я получаю

 Cannot connect to MongoDB at mongodb://localhost:55021

MongoServerSelectionError: getaddrinfo ENOTFOUND 944ef754a755
    at Timeout.<anonymous> (/Users/ekolotyluk/dev/crypto/customer-js/node_modules/mongodb/lib/sdam/topology.js:310:38)
    at listOnTimeout (internal/timers.js:554:17)
    at process.processTimers (internal/timers.js:497:7) {
  reason: TopologyDescription {
    type: 'ReplicaSetNoPrimary',
    servers: Map { '944ef754a755:27017' => [ServerDescription] },
    stale: false,
    compatible: true,
    heartbeatFrequencyMS: 10000,
    localThresholdMS: 15,
    setName: 'docker-rs',
    maxSetVersion: 1,
    maxElectionId: new ObjectId("7fffffff0000000000000001"),
    commonWireVersion: 8,
    logicalSessionTimeoutMinutes: undefined
  }
}
 

Есть ли какая-то магическая разница в URI MongoDB между клиентским API Kotlin и Node.js API? Сильно ли драйверы Java/Kotlin Mongo отличаются от Node.js водители?

Мой Node.js код выглядит примерно так

 const { MongoClient } = require("mongodb")
const mongoUri = getMongoUri()
const mongoClient = new MongoClient(mongoUri)

async function mongoConnect() {
  try {
    await mongoClient.connect()

  } catch(error) {
    console.error(`Cannot connect to MongoDB at ${mongoUri}n`)
    console.error(error)
  }
}
 

Было бы неплохо, если бы Node.js У водителя Монго была лучшая диагностика. Есть ли способ заставить водителя обеспечить лучшую диагностику?

Я подозреваю, что это может быть связано с https://baraksaidoff.medium.com/fixing-mongoserverselectionerror-while-connecting-mongodb-with-node-js-213aaf0bf596

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

В моем Node.js приложению, похоже, известен только IP-адрес 192.168.0.25 , но в моем коде Kotlin 127.0.0.1 он также известен. Я подозреваю, что 127.0.0.1 это есть в белом списке, но 192.168.0.25 разве это не… ?

Комментарии:

1. Есть ли элемент с именем 944ef754a755 в конфигурации набора реплик?

2. Я не знаю, как на это ответить. Я запускаю MongoDB в тестовой среде с помощью github.com/silaev/mongodb-replica-set но я еще не специалист в этом деле… идентификатор после ENOTFOUND меняется каждый раз, когда я запускаю тест.

3. Похоже, это может быть автоматически сгенерированное имя хоста.

4. Когда я запускаю MongoDB вручную в контейнере Docker, все работает нормально. Я предполагаю, что MongoDB настроен в testcontainers реализации так, что его белый список слишком ограничен, поэтому он не будет принимать соединение от процесса, отличного от того, в котором он был запущен.