Á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 einkenni | Hvað hún stjórnar | Núverandi skráð sjálfgefið gildi | Typísk túlkun |
serverSelectionTimeoutMS | Hversu lengi drifinn heldur áfram að reyna að finna nothæfan MongoDB netþjón | 30.000 ms | Toppólógía, DNS, eldveggur, IP aðgangur, ótiltækur netþjónn, eða enginn nothæfur aðal-/aukanetþjónn |
connectTimeoutMS | Hversu lengi ein TCP socket tengitilraun má taka | 30.000 ms í núverandi Node.js drif | Hýsing/port er ónæmi, síast út, eða of hæg til að stofna TCP tengingu |
socketTimeoutMS | Hversu lengi tengdur socket má vera óvirkur við sendi/móttöku áður en hann tímabrestur | 0, sem þýðir engin socket tímamót í núverandi Node.js drif | Yfirleitt viðeigandi eftir tengingu, sérstaklega fyrir langar eða stöðvaðar aðgerðir |
ETIMEDOUT / connection timeout | Nettengingarbilunareinkenni | Ekki sjálfgefin stilling | Oft 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.
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.
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.
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.
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:
| Val | Kostur | Ókostur | Hvar það getur skipt máli |
| Styttri server selection tímamót | Hröð bilun og hraðari upphafs endurgjöf | Minna 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úndur | Meiri þolinmæði fyrir tímabundna toppólógíu eða nettruflun | Rangar stillingar geta tekið 30 sekúndur að koma fram | Margar almennar framleiðsluútfærslur og replica sets |
| Lengri server selection tímamót | Meiri þolinmæði fyrir óvenju hæg endurheimt | Fyrirspurnir og upphaf geta hangað lengur áður en þær mistakast | Að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ða | Gagnlegasta næsta athugun |
Server selection timed out after 30000 ms | Skoðaðu err.reason, prófaðu síðan toppólógíu, DNS, TCP aðgengi, Atlas aðgangslista, og TLS |
getaddrinfo ENOTFOUND | Athugaðu hýsingarnafn og DNS/SRV leyst frá forritsumhverfinu |
ECONNREFUSED 127.0.0.1:27017 | Staðfestu að MongoDB keyri og hlusti á það netfang/port; í Docker, staðfestu að hýsingarnafnið sé ekki ranglega stillt á localhost |
ETIMEDOUT | Athugaðu eldvegg, ákvörðun, öryggishópa, IP leyfislista, VPN/proxy, og tiltæki netþjóns |
| TLS handshake eða vottorðsvilla | Lagaðu traustkeðju, hýsingarnafn, vottorð, eða studda TLS stillingu; ekki slökkva á staðfestingu sem framleiðslulausn |
| Auðkenning mistókst | Lagaðu notandanafn, lykilorð, URL encoding, authSource, eða gagnagrunnsnotanda stillingu |
Staðbundin tenging er hæg með localhost | Pró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.