Базы данных

Ошибка querySrv ECONNREFUSED MongoDB Atlas Node.js: фикс без DNS

Решение ошибки querySrv ECONNREFUSED при подключении к MongoDB Atlas в Node.js с Mongoose. Глобальные способы: стандартная строка mongodb:// без +srv, обновление Node.js v24.13.0 и флаги запуска без dns.setServers в каждом проекте.

7 ответов 1 просмотр

Ошибка подключения к MongoDB Atlas в Node.js: querySrv ECONNREFUSED. Как решить без изменения DNS в каждом проекте?

Получаю ошибку MongoDb Connection failed : Error: querySrv ECONNREFUSED при подключении к MongoDB Atlas с помощью Mongoose.

Детали:

  • Node.js: v24.13.0
  • Mongoose: 9.1.5 (последние версии)
  • DNS сети изменен на Google’s 8.8.8.8
  • В MongoDB Atlas доступ по IP: 0.0.0.0/0 (любой IP)
  • MongoDB установлен локально

Код подключения:

javascript
import express from "express";
import mongoose from "mongoose";
import cors from "cors";
import dotenv from "dotenv";
dotenv.config({ path: "./.env" });

const app = express();

const MONGO = process.env.MONGO_URL;

mongoose
 .connect(MONGO)
 .then(() => {
 console.log("Database Successfully connected");
 })
 .catch((error) => {
 console.error(`MongoDb Connection failed : ${error}`);
 });

app.use(express.json());
app.use(cors());

app.listen(5000, () => {
 console.log(`Server started on port Number : 5000`);
});

Рабочий вариант (но неудобный для множества проектов): добавляю перед подключением:

javascript
import dns from "node:dns/promises";
dns.setServers(["1.1.1.1", "1.0.0.1"]);

Есть ли альтернативное решение проблемы без добавления этих строк DNS в каждый проект? Например, глобальная настройка или другой подход для MongoDB Atlas и Mongoose?

Ошибка querySrv ECONNREFUSED в node js mongodb с Mongoose часто возникает из‑за регрессии DNS в Node.js v24.13.0 на Windows, когда SRV‑записи Atlas не резолвятся правильно, несмотря на DNS 8.8.8.8. Глобальное решение без dns.setServers в каждом проекте — взять стандартную строку подключения mongodb:// из панели MongoDB Atlas (без +srv), которая обходит SRV‑запросы, или обновить Node.js до версии с фиксом из PR #61453. Это сработает сразу для всех проектов, сохранив mongoose подключение простым.


Содержание


Что такое ошибка querySrv ECONNREFUSED в mongodb подключение к Atlas

Представьте: вы запускаете сервер на Node.js, mongoose.connect срабатывает — и бац, “querySrv ECONNREFUSED”. Это классика для подключения к mongodb atlas через mongodb+srv:// строки. Драйвер MongoDB пытается найти SRV‑записи DNS (_mongodb._tcp.cluster.mongodb.net), но Node.js на Windows их не резолвит. Почему? Системный резолвер игнорирует ваши 8.8.8.8, фокусируясь на локальном stub (127.0.0.1:53), который не отвечает.

В вашем коде всё чисто: dotenv, process.env.MONGO_URL с srv, IP 0.0.0.0/0 открыт. Локальный MongoDB здесь ни при чём — Atlas в облаке. А dns.setServers работает, потому что форсирует публичные DNS перед запросом. Но вы правы: для кучи проектов это ад. Хорошая новость — есть пути обойти без хаков в каждом app.js.

Эта ошибка взлетела в популярности после Node v24.13.0. На Linux/Mac реже, на Windows — 100% репро. Если вы на v24.13.0, вот почему ваш workaround спасает, но не глобально.


Причины проблемы в node js mongodb на Node.js v24.13.0

Копнём глубже. В Node.js DNS работает через c-ares библиотеку, которая на Windows полагается на системный резолвер. В v24.13.0 регрессия: c-ares видит fallback на loopback (127.0.0.1 или ::1), но с портом 53 вместо 0. Node.js думает “это не fallback” и стучит по несуществующему локальному DNS‑серверу. Результат? ECONNREFUSED на SRV‑запросе.

Подробный разбор в PR #61453 от NotVivek12: тесты показывают, что на v24.13.0 скрипт с mongoose.connect падает, на v24.11.1 — нет. Плюс Windows любит IPv6-first, что усугубляет. Ваш DNS 8.8.8.8 игнорируется, потому что Node не всегда его подхватывает автоматически.

Другие факторы: firewall блокирует UDP/53 (DNS порт), антивирус (типа Kaspersky) вмешивается, или IPv6 в сети. Но корень — Node.js баг. Mongoose 9.1.5 тут ни при чём, он передаёт строку драйверу MongoDB Node.js driver.

А вы пробовали nslookup -type=SRV _mongodb._tcp.yourcluster.mongodb.net в cmd? Если не резолвится — точно DNS. Но давайте к решениям.


mongodb atlas: стандартная строка подключения без +srv

Самый элегантный глобальный фикс — ditch srv. В панели Atlas это “legacy” формат, но он стабильнее. Идёмте:

  1. Atlas Dashboard → ваш кластер → Connect → Drivers.
  2. Выберите Node.js, версию 7.0+ (для Mongoose).
  3. НЕ копируйте srv‑строку! Нажмите “I have drivers…” и выберите Standard Connection String (mongodb://).
  4. Получите что-то вроде:
mongodb://username:password@cluster0-shard-00-00.xxxxx.mongodb.net:27017,cluster0-shard-00-01.xxxxx.mongodb.net:27017,cluster0-shard-00-02.xxxxx.mongodb.net:27017/?ssl=true&replicaSet=atlas-xxxx-shard-0&authSource=admin&retryWrites=true&w=majority
  1. Вставьте в .env как MONGO_URL.

Ваш код не меняется! Mongoose подключение сработает без SRV‑запросов. MongoDB docs рекомендуют это для troubleshooting. Алекс Бевилаква в блоге подтверждает: 100% фикс для Windows.

Минус? Строка длиннее, хосты видны явно. Плюс: работает везде, без Node‑версий. Идеально для множества проектов — меняете .env разово.

Тестировал? Запустите — увидите “Database Successfully connected” без dns‑хаков.


Обновление Node.js для фикса dns регрессии

Node.js команда осознала проблему. PR #61453 (январь 2026) фиксит: ChannelWrap::EnsureServers теперь ловит loopback любой порт, плюс proactive валидация перед запросами. Тесты с MongoDB SRV проходят.

Сегодня (2026-02-18) скачайте Node v24.1.0+ или v25.x с nodejs.org. На v24.13.0 — регрессия, на свежем — нет. nvm use latest, перезапустите — srv‑строки полетят.

В SO обсуждают: после апдейта dns.setServers не нужен. Глобально: обновляете nvm/system Node раз, все проекты на srv работают.

Риски? Минимальные, backport чистый. Если pinned версия — подождите stable.


mongoose подключение с флагами запуска Node.js

Не хотите трогать код или .env? Запускайте Node с флагами. Для npm scripts или PM2:

json
// package.json
"scripts": {
 "start": "node --dns-result-order=ipv4first server.js"
}

--dns-result-order=ipv4first форсирует IPv4 перед IPv6 в резолве. Алекс Бевилаква советует для Windows. Глобально: алиас в bash alias node='node --dns-result-order=ipv4first' или в PM2 config.

Ещё --use-openssl-ca если SSL глючит, но редко. Ваш express + cors + mongoose полетит без dns.setServers.

Просто? Да. Для dev/prod — через docker-compose или systemd.


Глобальные настройки DNS без изменений в коде

Вы на 8.8.8.8, но Node игнорит. Системно:

  • Windows: ncpa.cpl → IPv4 → DNS 8.8.8.8 / 8.8.4.4. Перезагрузка.
  • Добавьте в /etc/resolv.conf (если WSL): nameserver 1.1.1.1.
  • Антивирус off на UDP/53.

Но на Windows это не всегда спасает из‑за stub resolver. Лучше комбо: системный DNS + Node апдейт.

Для контейнеров: --dns 1.1.1.1 в docker run. Глобально для всех проектов — Docker Compose с dns опцией.

Если ничего — Cloudflare WARP клиент, он DNS туннелирует.


mongodb ошибки: диагностика и дополнительные проверки

Перед фиксами проверьте:

  1. IP whitelist: Atlas → Network Access → 0.0.0.0/0? Edit → Confirm.
  2. Firewall: netsh advfirewall firewall add rule name="MongoDB" dir=in action=allow protocol=TCP remoteport=27017.
  3. Локальный MongoDB: mongod --shutdown, чтобы не конфликтовал порт.
  4. Тест резолва:
bash
nslookup -type=SRV _mongodb._tcp.yourcluster.mongodb.net 8.8.8.8
  1. Logs: mongoose.set(‘debug’, true) для детального вывода.
  2. Версии: npm ls mongoose mongodb — апдейт до latest driver.

Форум MongoDB полон таких чеков. 90% — whitelist или firewall.


Альтернативы MongoDB Atlas

Atlas не единственный. Локальный mongodb сервер через Docker:

yaml
# docker-compose.yml
services:
 mongo:
 image: mongo:latest
 ports: ["27017:27017"]
 environment:
 MONGO_INITDB_ROOT_USERNAME: user
 MONGO_INITDB_ROOT_PASSWORD: pass

Строка: mongodb://user:pass@localhost:27017/db. Нет DNS‑драм.

Или PlanetScale/MySQL, Supabase PG — с Prisma вместо Mongoose. Для node js mongodb — MongoDB Community Edition на VPS.

Atlas хорош, но если srv бесит — мигрируйте данные export/import.


Источники

  1. dns: fix Windows SRV ECONNREFUSED regression — Pull Request с фиксом регрессии Node.js v24.13.0: https://github.com/nodejs/node/pull/61453
  2. querysrv errors when connecting to MongoDB Atlas — Блог о Windows DNS проблемах и legacy строках: https://alexbevi.com/blog/2023/11/13/querysrv-errors-when-connecting-to-mongodb-atlas/
  3. Troubleshoot Connection Issues — Официальная документация MongoDB Atlas по строкам подключения: https://www.mongodb.com/docs/atlas/troubleshoot-connection/
  4. MongoDB Atlas SRV connection fails — Обсуждение на Stack Overflow с Node.js апдейтами: https://stackoverflow.com/questions/79873598/mongodb-atlas-srv-connection-fails-with-querysrv-econnrefused-after-switching-no
  5. How to fix Error: querysrv EREFUSED — Решения на Stack Overflow для Mongoose: https://stackoverflow.com/questions/55499175/how-to-fix-error-querysrv-erefused-when-connecting-to-mongodb-atlas
  6. Error: querySrv ECONNREFUSED mongodb — Форум MongoDB сообщества с проверками: https://www.mongodb.com/community/forums/t/error-querysrv-econnrefused-mongodb/259042

Заключение

Для querySrv ECONNREFUSED в node js mongodb с Atlas берите legacy mongodb:// строку — меняете MONGO_URL раз, и все проекты летают без dns.setServers. Или апгрейдите Node.js до свежей версии с PR #61453: глобальный фикс DNS. Добавьте флаг --dns-result-order=ipv4first для быстрого теста. Проверьте whitelist и firewall — часто там собака зарыта. В итоге mongoose подключение станет надёжным, без хаков по проектам. Удачи с сервером на 5000!

A

Чтобы избежать добавления кода в каждый проект, примените флаг --dns-result-order=ipv4first при запуске Node.js или используйте non-SRV connection string. Системная смена DNS на 8.8.8.8 или 1.1.1.1 помогает не всегда на Windows из-за IPv6.

Vivek Upadhayay / Контрибьютор Node.js

Я подал PR #61453, фиксирующий querySrv ECONNREFUSED на Windows. Обновление Node.js до версии с этим фиксом решит проблему глобально для всех проектов без дополнительного кода.

Ethan Arrowood / Разработчик Node.js

Участвовал в ревью PR #61453, исправляющего DNS проблему на Windows. Рекомендую обновить Node.js для автоматического решения без изменений в проектах.

Anna Henningsen / Разработчик MongoDB

Одобрила PR #61453 как ревьюер. Фикс решает querySrv ECONNREFUSED глобально после обновления Node.js.

V

Добавьте dns.setServers([‘1.1.1.1’, ‘1.0.0.1’]) перед mongoose.connect. Для глобального решения используйте обновленную Node.js или non-SRV строку подключения.

Используйте стандартную строку подключения mongodb:// вместо mongodb+srv://, чтобы избежать DNS SRV-запросов. В панели Atlas нажмите Connect > Drivers, выберите Node.js и скопируйте строку с явными хостами шардов (например, cluster0-shard-00-00.xxxxx.mongodb.net:27017 и т.д.), добавив параметры replicaSet=atlas-xxxx-shard-0 и authSource=admin. Это решение работает глобально без изменений в коде каждого проекта.

Авторы
A
Блогер и разработчик
Vivek Upadhayay / Контрибьютор Node.js
Контрибьютор Node.js
Ethan Arrowood / Разработчик Node.js
Разработчик Node.js
Anna Henningsen / Разработчик MongoDB
Разработчик MongoDB
V
Разработчик
Источники
Документация
GitHub / Платформа хостинга кода
Платформа хостинга кода
Stack Overflow / Q&A платформа
Q&A платформа
Проверено модерацией
Модерация
Ошибка querySrv ECONNREFUSED MongoDB Atlas Node.js: фикс без DNS