#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
реализации так, что его белый список слишком ограничен, поэтому он не будет принимать соединение от процесса, отличного от того, в котором он был запущен.