Ошибка querySrv ECONNREFUSED MongoDB Atlas Node.js: фикс без DNS
Решение ошибки querySrv ECONNREFUSED при подключении к MongoDB Atlas в Node.js с Mongoose. Глобальные способы: стандартная строка mongodb:// без +srv, обновление Node.js v24.13.0 и флаги запуска без dns.setServers в каждом проекте.
Ошибка подключения к 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 установлен локально
Код подключения:
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`);
});
Рабочий вариант (но неудобный для множества проектов): добавляю перед подключением:
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 mongodb на Node.js v24.13.0
- mongodb atlas: стандартная строка подключения без +srv
- Обновление Node.js для фикса dns регрессии
- mongoose подключение с флагами запуска Node.js
- Глобальные настройки DNS без изменений в коде
- mongodb ошибки: диагностика и дополнительные проверки
- Альтернативы MongoDB Atlas
- Источники
- Заключение
Что такое ошибка 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” формат, но он стабильнее. Идёмте:
- Atlas Dashboard → ваш кластер → Connect → Drivers.
- Выберите Node.js, версию 7.0+ (для Mongoose).
- НЕ копируйте srv‑строку! Нажмите “I have drivers…” и выберите Standard Connection String (mongodb://).
- Получите что-то вроде:
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
- Вставьте в .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:
// 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 ошибки: диагностика и дополнительные проверки
Перед фиксами проверьте:
- IP whitelist: Atlas → Network Access → 0.0.0.0/0? Edit → Confirm.
- Firewall:
netsh advfirewall firewall add rule name="MongoDB" dir=in action=allow protocol=TCP remoteport=27017. - Локальный MongoDB:
mongod --shutdown, чтобы не конфликтовал порт. - Тест резолва:
nslookup -type=SRV _mongodb._tcp.yourcluster.mongodb.net 8.8.8.8
- Logs: mongoose.set(‘debug’, true) для детального вывода.
- Версии: npm ls mongoose mongodb — апдейт до latest driver.
Форум MongoDB полон таких чеков. 90% — whitelist или firewall.
Альтернативы MongoDB Atlas
Atlas не единственный. Локальный mongodb сервер через Docker:
# 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.
Источники
- dns: fix Windows SRV ECONNREFUSED regression — Pull Request с фиксом регрессии Node.js v24.13.0: https://github.com/nodejs/node/pull/61453
- querysrv errors when connecting to MongoDB Atlas — Блог о Windows DNS проблемах и legacy строках: https://alexbevi.com/blog/2023/11/13/querysrv-errors-when-connecting-to-mongodb-atlas/
- Troubleshoot Connection Issues — Официальная документация MongoDB Atlas по строкам подключения: https://www.mongodb.com/docs/atlas/troubleshoot-connection/
- 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
- 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
- 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!
Чтобы избежать добавления кода в каждый проект, примените флаг --dns-result-order=ipv4first при запуске Node.js или используйте non-SRV connection string. Системная смена DNS на 8.8.8.8 или 1.1.1.1 помогает не всегда на Windows из-за IPv6.
Добавьте 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. Это решение работает глобально без изменений в коде каждого проекта.

