Hvernig á að laga MongoDB net-tímamótavillu í Mongoose tengingu

Áhrifaríkasta lausnin er að hætta að meðhöndla hverja Mongoose tímamótavillu sem vandamál við stillingu tímamóts. Skilaboð eins og MongoServerSelectionError: connection timed out þýða yfirleitt að MongoDB drifinn gat ekki valið nothæfa netþjón áður en serverSelectionTimeoutMS rann út. Núverandi villuleitarbók MongoDB nefnir nettengingar, IP aðgangstakmarkanir í Atlas, DNS SRV mistök og TLS stillingar sem algengar orsakir. Aukning tímamóts getur látið forritið bíða lengur án þess að laga neitt af þessum aðstæðum.

Notið þessa röð í staðinn: 1) auðkennið hvaða tímamót mistókst, 2) sannið að forritshýsingin geti náð í MongoDB, 3) leiðréttið tengistrenginn eða umhverfissérhæfða netfangið, og 4) stillið tímamótsgildi aðeins eftir að tenging er staðfest virk. Dæmin hér að neðan nota nútímalegar Mongoose tengimynstur og núverandi hegðun MongoDB drifsins eins og hún er skráð í september 2026.

Fyrst, vertu viss um hvaða tímamót þú ert að skoða

Mongoose notar MongoDB Node.js drifinn undir yfirborðinu, svo nokkrar mismunandi tímamótsstillingar geta birst í sömu tengistillingunni. Þær þýða ekki sama hlutinn.

Stilling eða einkenniHvað hún stjórnarNúverandi skráð sjálfgefið gildiTypísk túlkun
serverSelectionTimeoutMSHversu lengi drifinn heldur áfram að reyna að finna nothæfan MongoDB netþjón30.000 msToppólógía, DNS, eldveggur, IP aðgangur, ótiltækur netþjónn, eða enginn nothæfur aðal-/aukanetþjónn
connectTimeoutMSHversu lengi ein TCP socket tengitilraun má taka30.000 ms í núverandi Node.js drifHýsing/port er ónæmi, síast út, eða of hæg til að stofna TCP tengingu
socketTimeoutMSHversu lengi tengdur socket má vera óvirkur við sendi/móttöku áður en hann tímabrestur0, sem þýðir engin socket tímamót í núverandi Node.js drifYfirleitt viðeigandi eftir tengingu, sérstaklega fyrir langar eða stöðvaðar aðgerðir
ETIMEDOUT / connection timeoutNettengingarbilunareinkenniEkki sjálfgefin stillingOft aðgengi, eldveggur, ákvörðun, DNS markmið, eða ótiltækur netþjónn

Núverandi tengingarskjöl Mongoose segja að serverSelectionTimeoutMS sé sjálfgefið 30 sekúndur og gildir bæði fyrir upphaflegt mongoose.connect() og síðari aðgerðir sem þurfa að velja netþjón. Node.js drif tengivalkostaskjöl MongoDB greina á milli þess gildis og connectTimeoutMS og socketTimeoutMS.

Kóðaritill og terminal sem sýnir MongooseServerSelectionError með ECONNRESET og server selection tímamót eftir 30000 millisekúndur

Server-selection tímamót er einkennið sem á að flokka fyrst; villuupplýsingarnar og undirliggjandi ástæða eru gagnlegri en að auka 30 sekúndna mörkin strax.

Skref 1: Fáðu nákvæma Mongoose villu og undirliggjandi ástæðu hennar

Byrjaðu með lágmarks tengingu og skráðu nægar upplýsingar til að greina á milli DNS, auðkenningar, TLS og aðgengisbilana:

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 sekúndna gildið hér að ofan er greiningarvalkostur, ekki framleiðsluráðlegging fyrir öll útfærslur. Mongoose segir að lækkun á serverSelectionTimeoutMS geti gefið hraðari endurgjöf, en varar sérstaklega við að lækka það óvarlega fyrir replica sets vegna þess að sjálfgefna 30 sekúndna glugginn getur hjálpað aðgerðum að lifa af kosningar og failovers. Mongoose mælir frekar með styttri gildum fyrir standalone MongoDB eða serverless keyrsluumhverfi þar sem hröð bilun er gagnleg.

Leitaðu að vísbendingum eins og:

  • getaddrinfo ENOTFOUND — DNS nafn er ekki hægt að leysa.
  • ECONNREFUSED — eitthvað hafnaði TCP tengingunni virkt, oft vegna þess að ekkert hlustar á hýsingu/port.
  • ETIMEDOUT — tengitilraunin kláraðist ekki í tíma, oft vegna þess að umferð er síuð, ákvörðuð rangt, eða markmiðið er ótiltækt.
  • TLS eða vottorðstexti — rannsakaðu vottorðstraust, hýsingarnafnspörun, stuðning við samskiptareglur, eða TLS stillingar.
  • Auðkenningarvillur inni í err.reason — lagaðu auðkenningarupplýsingar eða authSource í stað þess að breyta nettímamótum.

Skilyrði: ef villan segir nú þegar að auðkenning mistókst, slepptu eldveggstillunum þar til auðkenningarupplýsingar og auðkenningargagnagrunnur eru réttir. Nettímamót og hafnað innskráning eru ólíkar bilunarflokkar.

Skref 2: Sannaðu net, Atlas IP aðgang og DNS frá sama keyrsluumhverfi

Keyrðu tengiprófanir frá sömu vél, ílát, VM, serverless falli, eða Kubernetes pod þar sem Node.js ferlið keyrir. Prófun frá fartölvunni þinni nægir ekki ef framleiðsla keyrir annars staðar.

Villuleitarvísbending sem segir að MongoDB Atlas krefjist þess að IP forritsins sé á leyfislista og staðbundinn MongoDB ætti að vera aðgengilegur á stilltu portinu

Fyrir Atlas, staðfestu að raunverulegt útgöngu IP forritsins sé leyft; fyrir staðbundna útfærslu, staðfestu að MongoDB ferlið hlusti virkilega á væntanlegt viðmót og port.

Ef þú notar MongoDB Atlas

Atlas tekur við viðskiptavinatengingum aðeins frá netföngum sem leyfð eru af IP aðgangslista verkefnisins. MongoDB skráir þetta í Manage the IP Access List. Gakktu úr skugga um að opinbert útgöngu IP forritsumhverfisins sé á listanum, ekki bara IP persónulegu vinnustöðvarinnar þinnar.

Villuleitarleiðbeiningar MongoDB fyrir server-selection tímamót mæla einnig með því að athuga útvarpaða TCP tengingu við MongoDB á port 27017, ásamt eldveggjum, öryggishópum, net ACL, VPN og proxy.

Til dæmis, frá Linux eða macOS geturðu prófað tiltekinn Atlas hnút eða sjálfsstýndan hýslingu með:

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

Á Windows PowerShell, er gróf TCP aðgengisprófun:

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

Heppnuð TCP prófun sannaði ekki að auðkenning eða TLS muni takast, en misheppnuð TCP prófun þýðir að stilling Mongoose tímamóta er of snemm.

Ef URI þinn notar mongodb+srv://

SRV tengistrengur treystir á DNS SRV færslur. Núverandi villuleitaraðgerðir MongoDB mæla með því að athuga SRV leit frá viðskiptavinarumhverfinu:

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

Ef SRV fyrirspurnin mistekst, staðfestu hýsingarnafnið og DNS stillinguna. MongoDB skráir non-SRV mongodb:// tengistreng sem mögulega lausn þegar umhverfið getur ekki leyst SRV færslur, en þú ættir að fá þennan staðlaða tengistreng frá Atlas eða útfærslustillingunum þínum frekar en að finna upp hnútnöfn. Sjá Atlas tengivilluleit.

Greiningarvísbending sem dregur saman tengistreng, IP aðgang, eldvegg eða VPN athuganir, og Mongoose tímamótsvalkosti fyrir MongoDB tímamót

Rétt greiningarröð athugar netfangið og netleiðina áður en tímamótsgildi eru meðhöndluð sem rót vandamálsins.

Skref 3: Lagaðu URI fyrir umhverfið þar sem Node.js keyrir í raun

Syntaxlega gildur MongoDB URI getur samt vísað á rangt stað. Athugaðu skema, hýsingarnafn, port, gagnagrunnsnafn, replica-set kröfur, auðkenningaruppruna, og hvort hýsingarnafnið sé merkingarbært frá netbúnaði forritsins.

Staðbundinn Node.js og staðbundinn MongoDB

Mongoose mælir nú með 127.0.0.1 í stað localhost fyrir staðbundinn MongoDB:

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

Ástæðan er Node.js 18 og nýrra: Mongoose tekur fram að Node.js gæti leyst localhost sem IPv6 ::1, á meðan staðbundinn MongoDB tilvik gæti hlustað aðeins á IPv4. Mongoose skráir einnig { family: 4 } sem valkost þegar IPv6-fyrst leyst leitar gerir tengitilraunir hæg:

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

Notaðu family: 4 aðeins þegar IPv4/IPv6 leitarleiðin er í raun vandamálið. Ef MongoDB útfærslan þín styður IPv6 rétt, er óþarfi að þvinga IPv4.

Node.js inni í Docker

Ef forritið er inni í íláti, vísar localhost á það ílát, ekki sjálfkrafa á MongoDB á hýsingunni eða í öðru íláti. Notaðu MongoDB þjónustu/ílátshýsingarnafnið á sameiginlegu Docker neti, eða pallssérhæfða hýsingarnetið þegar MongoDB keyrir á hýsingunni.

Til dæmis, með Compose þjónustu nefndri mongo:

MONGODB_URI=mongodb://mongo:27017/myapp

Skilyrði: þetta dæmi á aðeins við ef ílötin deila neti og MongoDB þjónustan er í raun nefnd mongo. Ekki afrita hýsingarnafnið í óskylda útfærslu.

Atlas

Notaðu tengistrenginn sem Atlas býr til fyrir drifinn þinn, varðveittu mongodb+srv:// hýsinguna nákvæmlega, URL-encode varðveitt stafi í notandanöfnum eða lykilorðum þegar krafist, og staðfestu að gagnagrunnsnotandinn sé til í ætlunarverkefninu.

Ef þú tengist sjálfsstýndu replica set, verða hýsingarnöfnin sem replica set tilkynnir að vera aðgengileg frá viðskiptavininum. Fræhnútur (seed host) getur verið aðgengilegur en síðari netþjónaval mistekst samt vegna þess að replica set meðlimir kynna hýsingarnöfn sem forritið getur ekki leyst eða ákvarðað til.

Skref 4: Stilltu tímamót aðeins eftir að tenging tekst

Þegar DNS leyst, netleiðin virkar, netþjónninn er tiltækur, og URI er rétt, verður tímamótsstillingin merkingarbær.

JavaScript Mongoose tengidæmi sem sýnir serverSelectionTimeoutMS, socketTimeoutMS, connectTimeoutMS, og retryWrites valkosti

Mongoose sendir tímamóts-tengivalkosti til undirliggjandi MongoDB drifs, en hver valkostur stjórnar öðru stigi; stærri gildi ættu ekki að vera notuð til að fela brotla leið eða óaðgengilegan netþjón.

Varfærið dæmi fyrir forrit sem vill 10 sekúndna upphafsbilunarskilaboð gæti litið svona út:

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

Hvort 10 sekúndur sé viðeigandi fer eftir útfærslunni. Viðskiptin eru einföld:

ValKosturÓkosturHvar það getur skipt máli
Styttri server selection tímamótHröð bilun og hraðari upphafs endurgjöfMinna tími til að lifa af tímabundnar toppólógíubreytingar eða replica set kosningarÞróun, heilsufarsprófanir, sumar serverless upphafsleiðir, standalone MongoDB
Sjálfgefið 30 sekúndurMeiri þolinmæði fyrir tímabundna toppólógíu eða nettruflunRangar stillingar geta tekið 30 sekúndur að koma framMargar almennar framleiðsluútfærslur og replica sets
Lengri server selection tímamótMeiri þolinmæði fyrir óvenju hæg endurheimtFyrirspurnir og upphaf geta hangað lengur áður en þær mistakastAðeins þegar mæld endurheimtarhegðun réttlætir það

Fyrir socketTimeoutMS, nota núverandi MongoDB Node.js drif skjöl sjálfgefið gildi 0, sem þýðir engin socket óvirkni tímamót. MongoDB mælir með, þegar þú velur að stilla það, að velja gildi sem er u.þ.b. tvö til þrjú sinnum lengra en hægasta aðgerðin sem þú búist við. Sú stilling á við um sockets sem eru þegar tengdir, svo hún er ekki aðal lausnin fyrir upphaflegt server-selection tímamót.

Ekki afleita gamlar Mongoose tengivalkosti í núverandi verkefni

Mörg eldri dæmi innihalda enn useNewUrlParser, useUnifiedTopology, keepAlive, eða keepAliveInitialDelay. Núverandi Mongoose krefst ekki eldri parser/topology opt-ins, og Mongoose skráir keepAlive sem virkt sjálfgefið síðan Mongoose 5.2 og úrelt sem tengivalkost síðan 7.2.

Nútímalegur grunnur er meðvitaður lítil:

import mongoose from 'mongoose';

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

Bættu tengivalkostum vegna þess að umhverfið þitt þarf þá, ekki vegna þess að þeir komu fram í fimm ára gamalli kóðabút.

Hvað ef tengingin virkar, en fyrirspurnir tímabrestur síðar?

Það er annað vandamál. Ef mongoose.connect() tekst og forritið hangar síðar við fyrirspurnir, rannsakaðu aðgerðartöf, tengipressu í pool, netþjónsálag, index, og socket eða aðgerðartímamót. Núverandi Node.js drif MongoDB aðgreinir:

  • serverSelectionTimeoutMS — að finna nothæfan netþjón.
  • connectTimeoutMS — að stofna eina TCP tengingu.
  • socketTimeoutMS — óvirkni á stofnaðri socket.
  • maxTimeMS — að takmarka hversu lengi netþjónsaðgerð má keyra þegar hún nær MongoDB.

Ef aðeins langar fyrirspurnir mistakast, er ólíklegt að aukning á serverSelectionTimeoutMS leysi raunverulega vandamálið.

Hraðgreining eftir villuaðstæðum

Athuguð aðstaðaGagnlegasta næsta athugun
Server selection timed out after 30000 msSkoðaðu err.reason, prófaðu síðan toppólógíu, DNS, TCP aðgengi, Atlas aðgangslista, og TLS
getaddrinfo ENOTFOUNDAthugaðu hýsingarnafn og DNS/SRV leyst frá forritsumhverfinu
ECONNREFUSED 127.0.0.1:27017Staðfestu að MongoDB keyri og hlusti á það netfang/port; í Docker, staðfestu að hýsingarnafnið sé ekki ranglega stillt á localhost
ETIMEDOUTAthugaðu eldvegg, ákvörðun, öryggishópa, IP leyfislista, VPN/proxy, og tiltæki netþjóns
TLS handshake eða vottorðsvillaLagaðu traustkeðju, hýsingarnafn, vottorð, eða studda TLS stillingu; ekki slökkva á staðfestingu sem framleiðslulausn
Auðkenning mistókstLagaðu notandanafn, lykilorð, URL encoding, authSource, eða gagnagrunnsnotanda stillingu
Staðbundin tenging er hæg með localhostPrófaðu 127.0.0.1 eða family: 4 ef IPv6-fyrst leyst er orsök

Produktionsvæn tengimynstur

Haltu leyndarmálum úr kóðagrunni, biluðu upphaf skýrt þegar gagnagrunnurinn er ótiltækur, og skráðu nægar upplýsingar fyrir greiningu án þess að prenta auðkenningarupplýsingar:

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

Þau 30 sekúndna gildi passa við núverandi skráð sjálfgefin gildi, svo þú getur sleppt þeim nema að gera stefnuna skýra hjálpi rekstri þínum. Mikilvægasti hlutinn eru ekki tölurnar; það er að vita af hverju annað tala væri betri fyrir útfærsluna þína.

Lokaskoðunarlisti

  • Fáðu fulla villu og skoðaðu err.reason.
  • Staðfestu að MongoDB útfærslan keyri og sé tiltæk.
  • Keyrðu DNS og TCP prófanir frá sama umhverfi og Node.js ferlið.
  • Fyrir Atlas, staðfestu að útgöngu IP forritsins sé á IP aðgangslistanum.
  • Fyrir mongodb+srv://, staðfestu SRV DNS leyst.
  • Fyrir staðbundinn MongoDB, prófaðu 127.0.0.1 ef localhost leyst sem ónothæft IPv6.
  • Fyrir Docker eða Kubernetes, notaðu hýsingarnafn sem er gilt inni í því netbúnaði.
  • Lagaðu TLS eða auðkenningarvillur í stað þess að fela þær með stærri tímamóti.
  • Stilltu serverSelectionTimeoutMS, connectTimeoutMS, eða socketTimeoutMS aðeins fyrir stigið sem þau stjórna í raun.
  • Eftir lagfæringu, staðfestu að forritið tengist stöðugt frá raunverulegu útfærsluumhverfinu, ekki bara frá þróunartölvu.

Ályktun

Ef Mongoose tilkynnir MongoDB nettímamót, sannaðu fyrst að drifinn geti uppgötvað og náð nothæfum MongoDB netþjón. Atlas IP takmarkanir, eldveggir, DNS SRV leyst, rangar ílátshýsingarnöfn, IPv4/IPv6 ósamræmi, ótiltæk MongoDB ferli, og TLS stillingar geta allt látið 30 sekúndna tímamót virðast vera vandamálið þegar tíminn er aðeins að tilkynna bilunina.

Notaðu tímamótsstillingar til að skilgreina hversu lengi forritið þitt ætti að bíða eftir þekktu virku kerfi—ekki til að bæta upp fyrir brotla tengileið. Þegar netaðgengi og URI eru rétt, veldu þá tímamótsgildi sem passa við tiltækismat, failover hegðun, og væntanlega aðgerðartöf þína.

Skildu eftir athugasemd

Hvernig á að laga SSL-vottorðavandamál: Get ekki fengið staðvært útgefandavottorð í Git

Hvernig á að laga SSL-vottorðavandamál: Get ekki fengið staðvært útgefandavottorð í Git

Lagaðu Git-villuna „get ekki fengið staðvært útgefandavottorð“ með því að auðkenna traustbakendann, setja upp rétta CA-keðju og halda SSL-staðfestingu virkri.

Hvernig á að laga MongoDB net-tímamótavillu í Mongoose tengingu

Hvernig á að laga MongoDB net-tímamótavillu í Mongoose tengingu

Lagaðu MongoDB net-tímamótavillur í Mongoose með því að auðkenna tegund tímamóts, prófa aðgengi við Atlas eða TCP, leiðrétta URI og stilla tímamót aðeins þegar rétt er.

Hvernig á að laga Execution Policy Restricted villu í Windows PowerShell

Hvernig á að laga Execution Policy Restricted villu í Windows PowerShell

Lagaðu PowerShell execution policy Restricted villuna með því að athenda umfang og Group Policy, og velja síðan RemoteSigned, Unblock-File eða tímabundna valkost fyrir setu.

Hvernig á að laga npm ERR! code ERESOLVE Peer Dependency Conflict

Hvernig á að laga npm ERR! code ERESOLVE Peer Dependency Conflict

Lagaðu npm ERESOLVE peer dependency conflicts með því að auðkenna ósamhæfða pakkaröð, stilla útgáfur, nota npm explain og npm ls, og meðhöndla legacy-peer-deps eða force eingöngu sem stýrðar varalausnir.

Hvernig á að laga Redis-tengivillu við 127.0.0.1:6379

Hvernig á að laga Redis-tengivillu við 127.0.0.1:6379

Lagaðu villur þar sem Redis-tenging er hafnað á 127.0.0.1:6379 með því að athuga netþjóninn, port, Docker-netkerfi, redis.conf, auðkenningu og TLS.

Hvernig á að laga innri villu 500 í Next.js Server Components

Hvernig á að laga innri villu 500 í Next.js Server Components

Lagaðu 500-villur í Next.js Server Components með því að rekja server-logga, athuga gagnainnsóknir og umhverfisbreytur, meðhöndla villur og staðfesta framleiðslubygginguna.

Hvernig á að laga Kubernetes CrashLoopBackOff í staðbundnu Minikube

Hvernig á að laga Kubernetes CrashLoopBackOff í staðbundnu Minikube

Greinið og lagaðu Kubernetes CrashLoopBackOff í staðbundnu Minikube með því að athuga ástand poods, fyrri atvikaskrár, útgáfurök, prófanir, stillingar, minnisþak og heilsufar klusters.

Hvernig á að laga Docker Desktop Engine Stopped á Windows 11

Hvernig á að laga Docker Desktop Engine Stopped á Windows 11

Lagaðu Docker Desktop Engine Stopped á Windows 11 með því að athuga Docker stöðu, uppfæra og endurræsa WSL 2, staðfesta sýndarvæðingu og nota greiningu áður en núllstilling er framkvæmd.

Hvernig á að laga Uncaught ReferenceError: process is not defined í Vite

Hvernig á að laga Uncaught ReferenceError: process is not defined í Vite

Lagaðu villuna „process is not defined“ í Vite með því að skipta út Node-stíls notkun á process.env, stilla VITE_ breytur rétt og athuga háðir.

Hvernig á að laga „PyTorch CUDA Out of Memory“ villur við þjálfun líkana

Hvernig á að laga „PyTorch CUDA Out of Memory“ villur við þjálfun líkana

Lagaðu PyTorch CUDA minnisvillur með gagnlegri vinnuaðferð: mæltu GPU-minni, minnkaðu virka vinnusett, notaðu AMP og safnaðarstuðla, geymdu virkjunarpunkta og stilltu minnisstýringu aðeins ef þörf krefur.