Jak opravit chybu časového limitu sítě MongoDB v připojení Mongoose

Nejdůležitější opravou je přestat považovat každý časový limit Mongoose za problém s nastavením časového limitu. Zpráva jako MongoServerSelectionError: connection timed out obvykle znamená, že ovladač MongoDB nemohl vybrat použitelný server před vypršením hodnoty serverSelectionTimeoutMS. Současná dokumentace k řešení problémů MongoDB uvádí jako běžné příčiny problémy s připojením k síti, omezení přístupu IP v Atlasu, selhání DNS SRV a konfigurace TLS. Zvýšení časového limitu může způsobit, že aplikace bude čekat déle, aniž by opravila některou z těchto podmínek.

Místo toho použijte toto pořadí: 1) identifikujte, který časový limit selhal, 2) ověřte, že se hostitel aplikace může připojit k MongoDB, 3) opravte připojovací řetězec nebo adresu specifickou pro prostředí a 4) ladte hodnoty časových limitů až poté, co je známo, že připojení funguje. Níže uvedené příklady používají moderní vzory připojení Mongoose a současné chování ovladače MongoDB zdokumentované v září 2026.

Nejprve zjistěte, na který časový limit se díváte

Mongoose používá pod kapotou ovladač MongoDB pro Node.js, takže v jedné konfiguraci připojení se může objevit několik různých nastavení časového limitu. Neznamenají totéž.

Nastavení nebo příznakCo řídíAktuální zdokumentovaná výchozí hodnotaTypická interpretace
serverSelectionTimeoutMSJak dlouho se ovladač snaží najít vhodný server MongoDB30 000 msTopologie, DNS, firewall, přístup IP, nedostupný server nebo žádný vhodný primární/sekundární uzel
connectTimeoutMSJak dlouho může trvat jeden pokus o připojení TCP socketu30 000 ms v aktuálním ovladači Node.jsHostitel/port je nedostupný, filtrovaný nebo příliš pomalý na navázání TCP
socketTimeoutMSJak dlouho může být již připojený socket neaktivní během odesílání/přijímání před vypršením časového limitu0, což znamená žádný časový limit socketu v aktuálním ovladači Node.jsObvykle relevantní po připojení, zejména u dlouhých nebo zaseknutých operací
ETIMEDOUT / časový limit připojeníPříznak selhání na síťové úrovniNení výchozí hodnota konfiguraceČasto dostupnost, firewall, směrování, cíl DNS nebo nedostupný server

Aktuální dokumentace připojení Mongoose uvádí, že serverSelectionTimeoutMS má výchozí hodnotu 30 sekund a platí jak pro počáteční mongoose.connect(), tak pro pozdější operace, které potřebují vybrat server. Dokumentace možností připojení ovladače MongoDB pro Node.js rozlišuje tuto hodnotu od connectTimeoutMS a socketTimeoutMS.

Editor kódu a terminál zobrazující MongooseServerSelectionError s ECONNRESET a časovým limitem výběru serveru po 30000 milisekundách

Časový limit výběru serveru je příznak, který je třeba nejprve klasifikovat; podrobnosti o chybě a základní důvod jsou užitečnější než okamžité zvýšení 30sekundového limitu.

Krok 1: zachyťte přesnou chybu Mongoose a její základní důvod

Začněte s minimálním připojením a zaznamenejte dostatek informací k rozlišení selhání DNS, ověřování, TLS a dostupnosti:

import mongoose from 'mongoose';

try {
  await mongoose.connect(process.env.MONGODB_URI, {
    serverSelectionTimeoutMS: 5000
  });

  console.log('MongoDB connected');
} catch (err) {
  console.error(err);
  console.error('Reason:', err.reason);
  process.exit(1);
}

Výše uvedená hodnota 5 sekund je diagnostická volba, nikoli doporučení pro produkci pro každé nasazení. Mongoose uvádí, že snížení serverSelectionTimeoutMS může poskytnout rychlejší zpětnou vazbu, ale výslovně varuje před jeho náhodným snižováním pro replikové sady, protože výchozí 30sekundové okno může pomoci operacím přežít volby a přepnutí. Mongoose doporučuje kratší hodnoty spíše pro samostatné instance MongoDB nebo serverless běhové prostředí, kde je rychlé selhání užitečné.

Hledejte stopy jako:

  • getaddrinfo ENOTFOUND — název hostitele nelze přeložit přes DNS.
  • ECONNREFUSED — něco aktivně odmítlo TCP připojení, často proto, že na hostiteli/portu nic neposlouchá.
  • ETIMEDOUT — pokus o připojení nebyl dokončen včas, často proto, že je provoz filtrován, špatně směrován nebo cíl není dostupný.
  • Text týkající se TLS nebo certifikátu — prošetřujte důvěru v certifikát, shodu názvu hostitele, podporu protokolu nebo konfiguraci TLS.
  • Chyby ověřování uvnitř err.reason — opravte přihlašovací údaje nebo authSource místo měření síťových časových limitů.

Podmínka: pokud chyba již hlásí selhání ověřování, přeskočte ladění firewallu, dokud nebudou správné přihlašovací údaje a databáze pro ověřování. Časový limit sítě a zamítnuté přihlášení jsou různé třídy selhání.

Krok 2: ověřte síť, přístup IP Atlasu a DNS ze stejného běhového prostředí

Spusťte testy připojení ze stejného počítače, kontejneru, VM, serverless funkce nebo Kubernetes podu, kde běží proces Node.js. Testování z vašeho laptopu nestačí, pokud produkce běží někde jinde.

Tip na řešení problémů uvádějící, že MongoDB Atlas vyžaduje IP aplikaci na seznamu povolených a lokální MongoDB by měla být dostupná na konfigurovaném portu

Pro Atlas ověřte, že je povolena skutečná odchozí IP aplikace; pro lokální nasazení ověřte, že proces MongoDB skutečně poslouchá na očekávaném rozhraní a portu.

Pokud používáte MongoDB Atlas

Atlas přijímá klientská připojení pouze z adres povolených seznamem přístupových IP projektu. MongoDB to dokumentuje v Spravovat seznam přístupových IP. Ujistěte se, že je uvedena veřejná odchozí IP prostředí aplikace, nikoli pouze IP vašeho osobního pracovního stanice.

Průvodce řešením problémů s časovým limitem výběru serveru od MongoDB také doporučuje kontrolovat odchozí TCP připojení k MongoDB na portu 27017, spolu s firewally, bezpečnostními skupinami, síťovými ACL, VPN a proxy.

Například z Linuxu nebo macOS můžete otestovat konkrétní uzel Atlasu nebo hostitele spravovaný vlastními silami pomocí:

nc -vz your-mongodb-host.example.com 27017

V Windows PowerShell je hrubý test dostupnosti TCP:

Test-NetConnection your-mongodb-host.example.com -Port 27017

Úspěšný test TCP nedokazuje, že ověřování nebo TLS budou úspěšné, ale neúspěšný test TCP znamená, že ladění časového limitu Mongoose je předčasné.

Pokud váš URI používá mongodb+srv://

Řetězec připojení SRV závisí na záznamech DNS SRV. Současné kroky řešení problémů od MongoDB doporučují zkontrolovat vyhledávání SRV z klientského prostředí:

nslookup -type=SRV _mongodb._tcp.cluster-name.mongodb.net

Pokud dotaz SRV selže, potvrďte název hostitele a konfiguraci DNS. MongoDB dokumentuje připojovací řetězec mongodb:// bez SRV jako možný workaround, když prostředí nedokáže přeložit záznamy SRV, ale tento standardní připojovací řetězec byste měli získat z Atlasu nebo vaší konfigurační souboru nasazení, nikoli vymýšlet názvy uzlů. Viz Řešení problémů s připojením Atlas.

Diagnostické upozornění shrnující připojovací řetězec, přístup IP, kontroly firewallu nebo VPN a možnosti časového limitu Mongoose pro časový limit MongoDB

Správná diagnostická sekvence kontroluje adresu a síťovou cestu dříve, než začnete považovat hodnoty časových limitů za příčinu.

Krok 3: opravte URI pro prostředí, kde Node.js skutečně běží

Syntakticky platný URI MongoDB stále může ukazovat na špatné místo. Zkontrolujte schéma, název hostitele, port, název databáze, požadavky replikové sady, zdroj ověřování a zda je název hostitele smysluplný ze síťového jmenného prostoru aplikace.

Lokální Node.js a lokální MongoDB

Mongoose aktuálně doporučuje 127.0.0.1 místo localhost pro lokální MongoDB:

await mongoose.connect('mongodb://127.0.0.1:27017/myapp');

Důvodem je Node.js 18 a novější: Mongoose uvádí, že Node.js může přeložit localhost na IPv6 ::1, zatímco lokální instance MongoDB může poslouchat pouze na IPv4. Mongoose také dokumentuje { family: 4 } jako možnost, když překládání upřednostňující IPv6 zpomaluje pokusy o připojení:

await mongoose.connect('mongodb://localhost:27017/myapp', {
  family: 4
});

Použijte family: 4 pouze tehdy, když je cesta překládání IPv4/IPv6 skutečně problémem. Pokud vaše nasazení MongoDB správně podporuje IPv6, vynucování IPv4 je zbytečné.

Node.js uvnitř Dockeru

Pokud je aplikace uvnitř kontejneru, localhost odkazuje na tento kontejner, nikoli automaticky na MongoDB na hostiteli nebo v jiném kontejneru. Použijte název hostitele služby/kontejneru MongoDB na sdílené síti Docker, nebo platformě specifickou adresu hostitele, pokud MongoDB běží na hostiteli.

Například se službou Compose pojmenovanou mongo:

MONGODB_URI=mongodb://mongo:27017/myapp

Podmínka: tento příklad platí pouze pokud si kontejnery sdílejí síť a služba MongoDB je skutečně pojmenována mongo. Nekopírujte název hostitele do nesouvisejícího nasazení.

Atlas

Použijte připojovací řetězec vygenerovaný Atlasem pro váš ovladač, zachovejte přesně hostitele mongodb+srv://, zakódujte vyhrazené znaky v uživatelských jménech nebo heslech pomocí URL, pokud je to vyžadováno, a ověřte, že databázový uživatel existuje v zamýšleném projektu.

Pokud se připojujete k replikové sadě spravované vlastními silami, názvy hostitelů hlášené replikovou sadou musí být také dostupné z klienta. Seed hostitel může být dostupný, zatímco pozdější výběr serveru stále selhává, protože členové replikové sady inzerují názvy hostitelů, které aplikace nemůže přeložit nebo směrovat.

Krok 4: ladte časové limity až po úspěšném připojení

Jakmile se DNS přeloží, síťová cesta funguje, server je dostupný a URI je správné, ladění časových limitů nabývá smyslu.

Příklad připojení JavaScript Mongoose zobrazující možnosti serverSelectionTimeoutMS, socketTimeoutMS, connectTimeoutMS a retryWrites

Mongoose předává možnosti připojení související s časovým limem podkladovému ovladači MongoDB, ale každá možnost řídí jinou fázi; větší hodnoty by neměly být používány ke skrytí rozbité cesty nebo nedostupného serveru.

Konzervativní příklad pro aplikaci, která chce 10sekundový signál o počátečním selhání, může vypadat takto:

await mongoose.connect(process.env.MONGODB_URI, {
  serverSelectionTimeoutMS: 10000,
  connectTimeoutMS: 10000
});

To, zda je 10 sekund vhodné, závisí na nasazení. Kompromis je přímočarý:

VolbaVýhodaKompromisKde to může dávat smysl
Kratší časový limit výběru serveruRychlé selhání a rychlejší zpětná vazba při startuMéně času na přežití přechodných změn topologie nebo voleb replikové sadyVývoj, kontrola stavu, některé cesty startu serverless, samostatná MongoDB
Výchozích 30 sekundVětší tolerance k dočasnému výpadku topologie nebo sítěNesprávná konfigurace může trvat 30 sekund, než se projevíMnoho obecných produkčních nasazení a replikových sad
Delší časový limit výběru serveruVětší trpělivost s neobvykle pomalým obnovenímPožadavky a start mohou viset déle před selhánímPouze když měřené chování obnovení to odůvodňuje

Pro socketTimeoutMS používá aktuální dokumentace ovladače MongoDB pro Node.js výchozí hodnotu 0, což znamená žádný časový limit nečinnosti socketu. MongoDB doporučuje, když se rozhodnete ji nastavit, vybrat hodnotu přibližně dvakrát až třikrát delší než nejpomalejší očekávaná operace. Toto nastavení platí pro sockety, které se již připojily, takže to není hlavní oprava pro počáteční časový limit výběru serveru.

Nekopírujte staré možnosti připojení Mongoose do aktuálního projektu

Mnoho starších příkladů stále obsahuje useNewUrlParser, useUnifiedTopology, keepAlive nebo keepAliveInitialDelay. Aktuální Mongoose nevyžaduje staré volby parseru/topologie a Mongoose dokumentuje keepAlive jako povolené ve výchozím nastavení od Mongoose 5.2 a zastaralé jako možnost připojení od 7.2.

Moderní základ je záměrně malý:

import mongoose from 'mongoose';

await mongoose.connect(process.env.MONGODB_URI);

Přidejte možnosti připojení, protože je vaše prostředí potřebuje, ne proto, že se objevily ve snippetu starém pět let.

Co když připojení funguje, ale dotazy později vyprší?

To je jiný problém. Pokud mongoose.connect() uspěje a aplikace později visí na dotazech, prošetřujte latenci operací, tlak na fond připojení, zatížení serveru, indexy a časové limity socketu nebo operací. Aktuální ovladač MongoDB pro Node.js rozlišuje:

  • serverSelectionTimeoutMS — hledání vhodného serveru.
  • connectTimeoutMS — navázání jednoho TCP připojení.
  • socketTimeoutMS — nečinnost na established socketu.
  • maxTimeMS — omezení délky běhu serverové operace, jakmile dosáhne MongoDB.

Pokud selhávají pouze dlouhé dotazy, zvýšení serverSelectionTimeoutMS pravděpodobně nevyřeší skutečný problém.

Rychlá diagnostika podle podmínky chyby

Pozorovaná podmínkaNejužitečnější další kontrola
Server selection timed out after 30000 msProhledejte err.reason, poté otestujte topologii, DNS, dostupnost TCP, seznam přístupů Atlas a TLS
getaddrinfo ENOTFOUNDZkontrolujte název hostitele a překládání DNS/SRV z prostředí aplikace
ECONNREFUSED 127.0.0.1:27017Ověřte, že MongoDB běží a poslouchá na této adrese/portu; v Dockeru ověřte, že název hostitele není nesprávně nastaven na localhost
ETIMEDOUTZkontrolujte firewall, směrování, bezpečnostní skupiny, seznam povolených IP, VPN/proxy a dostupnost serveru
Chyba handshake TLS nebo certifikátuOpravte řetězec důvěry, název hostitele, certifikát nebo podporovanou konfiguraci TLS; nevypínejte validaci jako produkční opravu
Selhání ověřováníOpravte uživatelské jméno, heslo, kódování URL, authSource nebo konfiguraci databázového uživatele
Lokální připojení je pomalé s localhostZkuste 127.0.0.1 nebo family: 4, pokud je příčinou překládání upřednostňující IPv6

Vzorec připojení vhodný pro produkci

Udržujte tajné údaje mimo zdrojový kód, jasně selhejte při startu, když je databáze nedostupná, a zaznamenávejte dostatek podrobností pro diagnostiku bez tisku přihlašovacích údajů:

import mongoose from 'mongoose';

export async function connectDatabase() {
  const uri = process.env.MONGODB_URI;

  if (!uri) {
    throw new Error('MONGODB_URI is not set');
  }

  try {
    await mongoose.connect(uri, {
      serverSelectionTimeoutMS: 30000,
      connectTimeoutMS: 30000
    });

    console.log('MongoDB connected');
  } catch (err) {
    console.error('MongoDB connection failed:', err.message);
    console.error('Server selection reason:', err.reason);
    throw err;
  }
}

Tyto 30sekundové hodnoty odpovídají aktuálním zdokumentovaným výchozím hodnotám, takže je můžete vynechat, pokud explicitní politika nepomůže vašim operacím. Důležitá část nejsou čísla; je to vědět, proč by jiné číslo bylo lepší pro vaše nasazení.

Závěrečný kontrolní seznam

  • Zachyťte kompletní chybu a prohledejte err.reason.
  • Potvrďte, že nasazení MongoDB běží a je dostupné.
  • Spusťte testy DNS a TCP ze stejného prostředí jako proces Node.js.
  • Pro Atlas ověřte, že odchozí IP aplikace je na seznamu přístupových IP.
  • Pro mongodb+srv:// ověřte překládání DNS SRV.
  • Pro lokální MongoDB zkuste 127.0.0.1, pokud se localhost překládá na nepoužitelné IPv6.
  • Pro Docker nebo Kubernetes použijte název hostitele, který je platný uvnitř tohoto síťového jmenného prostoru.
  • Opravte chyby TLS nebo ověřování místo jejich maskování větším časovým limitem.
  • Ladte serverSelectionTimeoutMS, connectTimeoutMS nebo socketTimeoutMS pouze pro fázi, kterou skutečně řídí.
  • Po opravě ověřte, že se aplikace konzistentně připojuje ze skutečného prostředí nasazení, nikoli pouze z laptopu vývojáře.

Závěr

Pokud Mongoose hlásí časový limit sítě MongoDB, nejprve dokažte, že ovladač může objevit a dosáhnout vhodného serveru MongoDB. Omezení IP Atlasu, firewally, překládání DNS SRV, nesprávné názvy hostitelů kontejnerů, nesoulad IPv4/IPv6, nedostupné procesy MongoDB a konfigurace TLS mohou všechny způsobit, že se 30sekundový časový limit zdá být problémem, i když časovač pouze hlásí selhání.

Používejte nastavení časových limitů k definování toho, jak dlouho má vaše aplikace čekat na známý funkční systém – ne ke kompenzaci rozbité cesty připojení. Jakmile je síťová dostupnost a URI správné, pak vyberte hodnoty časových limitů, které odpovídají vašemu modelu dostupnosti, chování při přepnutí a očekávané latenci operací.

Zanechat komentář

Jak opravit problém se SSL certifikátem: Nelze získat lokální certifikát vydavatele v Gitu

Jak opravit problém se SSL certifikátem: Nelze získat lokální certifikát vydavatele v Gitu

Opravte chybu Gitu 'nelze získat lokální certifikát vydavatele' identifikací důvěryhodného backendu, instalací správného řetězce CA a ponecháním ověřování SSL zapnutého.

Jak opravit chybu časového limitu sítě MongoDB v připojení Mongoose

Jak opravit chybu časového limitu sítě MongoDB v připojení Mongoose

Opravte chyby časového limitu sítě MongoDB v Mongoose identifikací typu časového limitu, testováním dostupnosti Atlasu nebo TCP, opravou URI a laděním časových limitů pouze v odůvodněných případech.

Jak opravit chybu Execution Policy Restricted ve Windows PowerShell

Jak opravit chybu Execution Policy Restricted ve Windows PowerShell

Opravte chybu Execution Policy Restricted v PowerShellu kontrolou rozsahu a Skupinové politiky, poté zvolte RemoteSigned, Unblock-File nebo dočasnou možnost relace.

Jak opravit chybu npm ERR! code ERESOLVE: Konflikt peer dependencies

Jak opravit chybu npm ERR! code ERESOLVE: Konflikt peer dependencies

Opravte konflikty peer dependencies v npm identifikací nekompatibilního rozsahu balíčků, zarovnáním verzí, použitím příkazů npm explain a npm ls a používáním legacy-peer-deps nebo force pouze jako kontrolovaných záložních řešení.

Jak opravit chybu připojení Redis k 127.0.0.1:6379

Jak opravit chybu připojení Redis k 127.0.0.1:6379

Opravte chyby odmítnutí připojení Redis na 127.0.0.1:6379 kontrolou serveru, portu, síťového nastavení Dockeru, redis.conf, ověřování a TLS.

Jak opravit interní chybu 500 v Next.js Server Components

Jak opravit interní chybu 500 v Next.js Server Components

Opravte chyby 500 v Next.js Server Components sledováním serverových logů, kontrolou načítání dat a proměnných prostředí, zpracováním chyb a ověřením produkčního buildu.

Jak opravit Kubernetes CrashLoopBackOff v lokálním Minikube

Jak opravit Kubernetes CrashLoopBackOff v lokálním Minikube

Diagnostikujte a opravte Kubernetes CrashLoopBackOff v lokálním Minikube kontrolou stavu podu, předchozích logů, důvodů ukončení, sond, konfigurace, limitů paměti a zdraví klastru.

Jak opravit chybu „Engine stopped“ v Docker Desktop na Windows 11

Jak opravit chybu „Engine stopped“ v Docker Desktop na Windows 11

Opravte chybu „Engine stopped“ v Docker Desktop na Windows 11 kontrolou stavu Dockeru, aktualizací a restartem WSL 2, ověřením virtualizace a použitím diagnostiky před resetem.

Jak opravit chybu Uncaught ReferenceError: process is not defined ve Vite

Jak opravit chybu Uncaught ReferenceError: process is not defined ve Vite

Opravte chybu process is not defined ve Vite nahrazením použití process.env ve stylu Node.js, správnou konfigurací proměnných VITE_ a kontrolou závislostí.

Jak opravit chybu „PyTorch CUDA Out of Memory“ během trénování modelu

Jak opravit chybu „PyTorch CUDA Out of Memory“ během trénování modelu

Opravte chyby nedostatečné paměti CUDA v PyTorch pomocí praktického postupu: měřte paměť GPU, zmenšete pracovní množinu, použijte AMP a akumulaci gradientů, ukládejte aktivace (checkpointing) a laděte alokátor pouze v případě potřeby.