Så åtgärdar du MongoDB-nätverksavbrott vid Mongoose-anslutning

Den viktigaste åtgärden är att sluta behandla varje Mongoose-avbrott som ett problem med tidsgränsinställningar. Ett meddelande som MongoServerSelectionError: connection timed out betyder vanligtvis att MongoDB-drivrutinen inte kunde välja en användbar server innan serverSelectionTimeoutMS löpte ut. MongoDBs aktuella felsökningsdokumentation listar nätverksanslutning, Atlas IP-åtkomstbegränsningar, DNS SRV-fel och TLS-konfiguration som vanliga orsaker. Att öka tidsgränsen kan få applikationen att vänta längre utan att reparera någon av dessa förutsättningar.

Använd denna ordning istället: 1) identifiera vilket avbrott som misslyckades, 2) bevisa att applikationsvärden kan nå MongoDB, 3) korrigera anslutningssträngen eller den miljöspecifika adressen, och 4) justera tidsgränsvärden endast efter att anslutningen är känd för att fungera. Exemplen nedan använder moderna Mongoose-anslutningsmönster och aktuellt MongoDB-drivrutinsbeteende som dokumenterats i september 2026.

Först, veta vilket avbrott du tittar på

Mongoose använder MongoDB Node.js-drivrutinen under huven, så flera olika tidsgränsinställningar kan förekomma i samma anslutningskonfiguration. De betyder inte samma sak.

Inställning eller symtomVad den styrAktuell dokumenterad standardTypisk tolkning
serverSelectionTimeoutMSHur länge drivrutinen fortsätter att försöka hitta en lämplig MongoDB-server30 000 msTopologi, DNS, brandvägg, IP-åtkomst, otillgänglig server, eller ingen lämplig primär/sekundär
connectTimeoutMSHur lång tid ett TCP-socketanslutningsförsök får ta30 000 ms i den aktuella Node.js-drivrutinenVärd/port är otillgänglig, filtrerad eller för långsam för att upprätta TCP
socketTimeoutMSHur länge ett redan anslutet socket får vara inaktivt under sändning/mottagning innan det avbryts0, vilket innebär ingen socket-tidsgräns i den aktuella Node.js-drivrutinenVanligtvis relevant efter anslutning, särskilt för långa eller fastnade operationer
ETIMEDOUT / anslutningsavbrottNivåsymtom för nätverksfelInte en konfigurationsstandardOfta tillgänglighet, brandvägg, routing, DNS-mål eller otillgänglig server

Mongoses aktuella dokumentation för anslutningar anger att serverSelectionTimeoutMS har en standard på 30 sekunder och gäller både för initial mongoose.connect() och för senare operationer som behöver välja en server. MongoDBs dokumentation för anslutningsalternativ för Node.js-drivrutinen skiljer det värdet från connectTimeoutMS och socketTimeoutMS.

Kodredigerare och terminal som visar MongooseServerSelectionError med ECONNRESET och ett servervalstidsavbrott efter 30000 millisekunder

Ett servervalstidsavbrott är symtomet som ska klassificeras först; felinformationerna och den underliggande orsaken är mer användbara än att omedelbart öka 30-sekundersgränsen.

Steg 1: fånga det exakta Mongoose-felet och dess underliggande orsak

Börja med en minimal anslutning och logga tillräckligt med information för att skilja på DNS-, autentiserings-, TLS- och tillgänglighetsfel:

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);
}

5-sekundersvärdet ovan är ett diagnostiskt val, inte en produktionsrekommendation för varje distribution. Mongoose säger att minskning av serverSelectionTimeoutMS kan ge snabbare återkoppling, men varnar specifikt mot att minska det slarvigt för replikamängder eftersom standardfönstret på 30 sekunder kan hjälpa operationer att överleva val och failovers. Mongoose föreslår kortare värden mer lätt för fristående MongoDB eller serverlösa körningar där snabbt fel är användbart.

Leta efter ledtrådar som:

  • getaddrinfo ENOTFOUND — DNS-namnet kan inte lösas upp.
  • ECONNREFUSED — något aktivt nekade TCP-anslutningen, ofta för att inget lyssnar på värden/porten.
  • ETIMEDOUT — anslutningsförsöket slutfördes inte i tid, ofta för att trafik filtreras, dirigeras felaktigt eller destinationen är otillgänglig.
  • TLS- eller certifikattext — undersök certifikattillit, värdnamnsmatchning, protokollstöd eller TLS-konfiguration.
  • Autentiseringsfel inuti err.reason — fixa autentiseringsuppgifter eller authSource istället för att ändra nätverkstidsgränser.

Villkor: om felet redan säger att autentisering misslyckades, hoppa över brandväggjusteringar tills autentiseringsuppgifterna och autentiseringsdatabasen är korrekta. Ett nätverksavbrott och ett nekat inloggning är olika felklasser.

Steg 2: bevisa nätverk, Atlas IP-åtkomst och DNS från samma körning

Kör anslutningstester från samma maskin, container, VM, serverlösa funktion eller Kubernetes-pod där Node.js-processen körs. Att testa från din bärbara dator räcker inte om produktionen körs någon annanstans.

Felsökningstips som anger att MongoDB Atlas kräver applikationens IP på tillåtelselistan och att lokal MongoDB ska vara nåbar på den konfigurerade porten

För Atlas, verifiera att applikationens verkliga utgående IP är tillåten; för en lokal distribution, verifiera att MongoDB-processen faktiskt lyssnar på det förväntade gränssnittet och porten.

Om du använder MongoDB Atlas

Atlas accepterar klientanslutningar endast från adresser som tillåts av projektets IP-åtkomstlista. MongoDB dokumenterar detta i Hantera IP-åtkomstlistan. Se till att den offentliga utgående IP:n för applikationsmiljön är listad, inte bara din personliga arbetsstations IP.

MongoDBs felsökningsguide för servervalstidsavbrott rekommenderar också att kontrollera utgående TCP-anslutning till MongoDB på port 27017, tillsammans med brandväggar, säkerhetsgrupper, nätverks-ACL, VPN och proxyer.

Till exempel, från Linux eller macOS kan du testa en specifik Atlas-nod eller självhanterad värd med:

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

På Windows PowerShell är ett ungefärligt TCP-tillgänglighetstest:

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

Ett framgångsrikt TCP-test bevisar inte att autentisering eller TLS kommer att lyckas, men ett misslyckat TCP-test betyder att Mongoose-tidsgränsjustering är för tidig.

Om din URI använder mongodb+srv://

En SRV-anslutningssträng är beroende av DNS SRV-poster. MongoDBs aktuella felsökningssteg rekommenderar att kontrollera SRV-uppslagningen från klientmiljön:

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

Om SRV-frågan misslyckas, bekräfta värdnamnet och DNS-konfigurationen. MongoDB dokumenterar en icke-SRV mongodb:// anslutningssträng som en möjlig lösning när miljön inte kan lösa upp SRV-poster, men du bör erhålla den standardanslutningssträngen från Atlas eller din distributionskonfiguration istället för att hitta på nodnamn. Se Atlas anslutningsfelsökning.

Diagnostisk ruta som sammanfattar anslutningssträng, IP-åtkomst, brandvägg eller VPN-kontroller och Mongoose-tidsgränsalternativ för ett MongoDB-avbrott

Den korrekta diagnostiska sekvensen kontrollerar adressen och nätverksvägen innan tidsgränsvärden behandlas som grundorsaken.

Steg 3: fixa URI:n för miljön där Node.js faktiskt körs

En syntaktiskt giltig MongoDB URI kan fortfarande peka på fel plats. Kontrollera schemat, värdnamnet, porten, databasnamnet, replikamängdskrav, autentiseringskällan och om värdnamnet är meningsfullt från applikationens nätverksnamnrymd.

Lokal Node.js och lokal MongoDB

Mongoose rekommenderar för närvarande 127.0.0.1 istället för localhost för lokal MongoDB:

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

Anledningen är Node.js 18 och nyare: Mongoose noterar att Node.js kan lösa upp localhost till IPv6 ::1, medan en lokal MongoDB-instans kan lyssna endast på IPv4. Mongoose dokumenterar också { family: 4 } som ett alternativ när IPv6-först-resolution gör anslutningsförsök långsamma:

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

Använd family: 4 endast när IPv4/IPv6-resolutionsvägen faktiskt är problemet. Om din MongoDB-distribution stöder IPv6 korrekt, är det onödigt att tvinga IPv4.

Node.js inuti Docker

Om applikationen är inuti en container, refererar localhost till den containern, inte automatiskt till MongoDB på värden eller i en annan container. Använd MongoDB-tjänsten/container-värdnamnet på ett delat Docker-nätverk, eller den plattformsspecifika värdenadressen när MongoDB körs på värden.

Till exempel, med en Compose-tjänst namnad mongo:

MONGODB_URI=mongodb://mongo:27017/myapp

Villkor: detta exempel gäller endast om containrarna delar ett nätverk och MongoDB-tjänsten faktiskt är namnad mongo. Kopiera inte värdnamnet till en orelaterad distribution.

Atlas

Använd anslutningssträngen som genererats av Atlas för din drivrutin, bevara mongodb+srv://-värden exakt, URL-koda reserverade tecken i användarnamn eller lösenord när det krävs, och verifiera att databasanvändaren finns i det avsedda projektet.

Om du ansluter till en självhanterad replikamängd, måste värdnamnen som rapporteras av replikamängden också vara nåbara från klienten. En seed-värd kan vara nåbar medan senare serverval fortfarande misslyckas eftersom replikamängdsmedlemmar annonserar värdnamn som applikationen inte kan lösa upp eller dirigeras till.

Steg 4: justera tidsgränser endast efter att anslutningen lyckats

När DNS löser upp, nätverksvägen fungerar, servern är tillgänglig och URI:n är korrekt, blir tidsgränsjustering meningsfull.

JavaScript Mongoose anslutningsexempel som visar serverSelectionTimeoutMS, socketTimeoutMS, connectTimeoutMS och retryWrites-alternativ

Mongoose skickar tidsgränsrelaterade anslutningsalternativ till den underliggande MongoDB-drivrutinen, men varje alternativ styr ett annat stadium; större värden bör inte användas för att dölja en trasig väg eller otillgänglig server.

Ett konservativt exempel för en applikation som vill ha en 10-sekunders initial fel signal kan se ut så här:

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

Huruvida 10 sekunder är lämpligt beror på distributionen. Avvägningen är enkel:

ValFördelAvvägningDär det kan vara meningsfullt
Kortare servervalstidsgränsSnabbt fel och snabbare startåterkopplingMindre tid att överleva tillfälliga topologiförändringar eller replikamängdsvalUtveckling, hälsokontroller, vissa serverlösa startvägar, fristående MongoDB
Standard 30 sekunderMer tolerans för tillfällig topologi eller nätverksstörningFelkonfiguration kan ta 30 sekunder att dyka uppMånga allmänna produktionsdistributioner och replikamängder
Längre servervalstidsgränsMer tålamod för ovanligt långsam återhämtningFörfrågningar och start kan hänga längre innan de misslyckasEndast när mätt återhämtningsbeteende motiverar det

För socketTimeoutMS, använder den aktuella MongoDB Node.js-drivrutindokumentationen en standard på 0, vilket innebär ingen socket-inaktivitetstidsgräns. MongoDB rekommenderar, när du väljer att ställa in den, att välja ett värde ungefär två till tre gånger längre än den långsammaste operationen du förväntar dig. Den inställningen gäller för sockets som redan har anslutit, så det är inte den primära fixen för ett initialt servervalstidsavbrott.

Kopiera inte gamla Mongoose-anslutningsalternativ till ett aktuellt projekt

Många äldre exempel innehåller fortfarande useNewUrlParser, useUnifiedTopology, keepAlive eller keepAliveInitialDelay. Aktuellt Mongoose kräver inte de gamla parser-/topologi-opt-ins, och Mongoose dokumenterar keepAlive som aktiverat som standard sedan Mongoose 5.2 och föråldrat som ett anslutningsalternativ sedan 7.2.

En modern baslinje är avsiktligt liten:

import mongoose from 'mongoose';

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

Lägg till anslutningsalternativ eftersom din miljö behöver dem, inte eftersom de dök upp i ett fem år gammalt kodutdrag.

Vad händer om anslutningen fungerar, men förfrågningar avbryts senare?

Det är ett annat problem. Om mongoose.connect() lyckas och applikationen senare hänger sig på förfrågningar, undersök operationslatens, anslutningspooltryck, serverbelastning, index och socket- eller operationstidsgränser. MongoDBs aktuella Node.js-drivrutin separerar:

  • serverSelectionTimeoutMS — hitta en lämplig server.
  • connectTimeoutMS — upprätta en TCP-anslutning.
  • socketTimeoutMS — inaktivitet på ett etablerat socket.
  • maxTimeMS — begränsa hur länge en serveroperation får köra när den når MongoDB.

Om endast långa förfrågningar misslyckas, är det osannolikt att ökning av serverSelectionTimeoutMS löser det verkliga problemet.

Snabb diagnos efter felvillkor

Observerat villkorMest användbar nästa kontroll
Server selection timed out after 30000 msInspektera err.reason, testa sedan topologi, DNS, TCP-tillgänglighet, Atlas åtkomstlista och TLS
getaddrinfo ENOTFOUNDKontrollera värdnamn och DNS/SRV-resolution från applikationsmiljön
ECONNREFUSED 127.0.0.1:27017Verifiera att MongoDB körs och lyssnar på den adressen/porten; i Docker, verifiera att värdnamnet inte felaktigt är inställt på localhost
ETIMEDOUTKontrollera brandvägg, routing, säkerhetsgrupper, IP-tillåtelselista, VPN/proxy och servertillgänglighet
TLS-handskakning eller certifikatfelFixa tillitkedja, värdnamn, certifikat eller stödd TLS-konfiguration; inaktivera inte validering som en produktionsfix
Autentisering misslyckadesFixa användarnamn, lösenord, URL-kodning, authSource eller databasanvändarkonfiguration
Lokal anslutning är långsam med localhostProva 127.0.0.1 eller family: 4 om IPv6-först-resolution är orsaken

Ett produktionsvänligt anslutningsmönster

Håll hemligheter utanför källkoden, misslyckas vid start tydligt när databasen är otillgänglig, och logga tillräckligt med detaljer för diagnos utan att skriva ut autentiseringsuppgifter:

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;
  }
}

De 30-sekundersvärdena matchar aktuella dokumenterade standarder, så du kan utelämna dem om det inte hjälper dina operationer att göra policyn explicit. Den viktiga delen är inte siffrorna; det är att veta varför ett annat värde skulle vara bättre för din distribution.

Slutlig checklista

  • Fånga det kompletta felet och inspektera err.reason.
  • Bekräfta att MongoDB-distributionen körs och är tillgänglig.
  • Kör DNS- och TCP-tester från samma miljö som Node.js-processen.
  • För Atlas, verifiera att applikationens utgående IP finns på IP-åtkomstlistan.
  • För mongodb+srv://, verifiera SRV DNS-resolution.
  • För lokal MongoDB, prova 127.0.0.1 om localhost löser upp till oanvändbar IPv6.
  • För Docker eller Kubernetes, använd ett värdnamn som är giltigt inuti den nätverksnamnrymden.
  • Fixa TLS- eller autentiseringsfel istället för att maskera dem med en större tidsgräns.
  • Justera serverSelectionTimeoutMS, connectTimeoutMS eller socketTimeoutMS endast för det stadium de faktiskt styr.
  • Efter fixen, verifiera att applikationen ansluter konsekvent från den verkliga distributionsmiljön, inte bara från en utvecklarbärbar dator.

Slutsats

Om Mongoose rapporterar ett MongoDB-nätverksavbrott, bevisa först att drivrutinen kan upptäcka och nå en lämplig MongoDB-server. Atlas IP-begränsningar, brandväggar, DNS SRV-resolution, felaktiga container-värdnamn, IPv4/IPv6-mismatch, otillgängliga MongoDB-processer och TLS-konfiguration kan alla få ett 30-sekundersavbrott att se ut som problemet när timern bara rapporterar felet.

Använd tidsgränsinställningar för att definiera hur länge din applikation bör vänta på ett känd-god system – inte för att kompensera för en trasig anslutningsväg. När nätverkstillgänglighet och URI:n är korrekta, välj sedan tidsgränsvärden som matchar din tillgänglighetsmodell, failover-beteende och förväntad operationslatens.

Lämna en kommentar

Hur man åtgärdar "Tailwind CSS-stilar uppdateras inte" i en Vite React-app

Hur man åtgärdar "Tailwind CSS-stilar uppdateras inte" i en Vite React-app

Åtgärda Tailwind CSS-stilar som inte uppdateras i Vite React genom att kontrollera Tailwind v4-inställningar, CSS-importer, källkodsidentifiering, dynamiska klasser, HMR och inaktuella cacher.

Så här åtgärdar du ModuleNotFoundError: Ingen modul med namnet 'pip' i Python 3

Så här åtgärdar du ModuleNotFoundError: Ingen modul med namnet 'pip' i Python 3

Åtgärda Python 3:s ModuleNotFoundError för pip på Windows, macOS och Linux med ensurepip, OS-paket, virtuella miljöer och tolkkontroller.

Hur man åtgärdar "Tillstånd nekad (publickey)" i GitHub SSH

Hur man åtgärdar "Tillstånd nekad (publickey)" i GitHub SSH

Åtgärda GitHub SSH-behörighet nekad (publickey) genom att kontrollera värden, aktiv SSH-nyckel, GitHub-konto, SSO-auktorisering, fjärr-URL och port 22-åtkomst.

Hur man åtgärdar "Git Push Rejected: Non-Spolar framåt" utan att förlora ändringar

Hur man åtgärdar "Git Push Rejected: Non-Spolar framåt" utan att förlora ändringar

Åtgärda en Git-push som inte snabbspolar framåt på ett säkert sätt. Skydda lokalt arbete, hämta fjärrcommits, välj merge eller rebase, lös konflikter och pusha utan att förlora ändringar.

Hur man åtgärdar "Nginx 502 Bad Gateway" vid proxyanvändning till Node.js

Hur man åtgärdar "Nginx 502 Bad Gateway" vid proxyanvändning till Node.js

Åtgärda Nginx 502 Bad Gateway-fel med en Node.js-uppström genom att kontrollera appporten, NGINX-loggarna, proxy_pass-adressen, containernätverk, timeouts och omladdning.

How to Fix “Type 'null' Is Not Assignable to Type” in TypeScript

How to Fix “Type 'null' Is Not Assignable to Type” in TypeScript

Fix TypeScript's “Type 'null' is not assignable to type” error with union types, narrowing, defaults, and safe assertions under strictNullChecks.

Så här åtgärdar du felet ”Prisma Client has not been generated yet”

Så här åtgärdar du felet ”Prisma Client has not been generated yet”

Åtgärda felet att Prisma Client inte har genererats genom att kontrollera din generator, ditt schema, utdatasökvägen, importerna, versionerna, monorepo-konfigurationen och byggstegen vid distribution.

Hur man åtgärdar "ERR_MODULE_NOT_FOUND" i Node.js ESM-importer

Hur man åtgärdar "ERR_MODULE_NOT_FOUND" i Node.js ESM-importer

Åtgärda Node.js ERR_MODULE_NOT_FOUND i ESM genom att kontrollera importsökvägar, filtillägg, paketinstallation, exporter, ESM-läge och rena installationer.

Så här åtgärdar du SSL-certifikatproblemet: Unable to Get Local Issuer Certificate i Git

Så här åtgärdar du SSL-certifikatproblemet: Unable to Get Local Issuer Certificate i Git

Åtgärda Gits fel 'unable to get local issuer certificate' genom att identifiera förtroendebakgrunden, installera rätt CA-kedja och hålla SSL-verifieringen aktiverad.

Så åtgärdar du MongoDB-nätverksavbrott vid Mongoose-anslutning

Så åtgärdar du MongoDB-nätverksavbrott vid Mongoose-anslutning

Åtgärda MongoDB-nätverksavbrott i Mongoose genom att identifiera avbrottstypen, testa Atlas- eller TCP-anslutning, korrigera URI:n och justera tidsgränser endast när det är motiverat.