Mongoose: يؤدي {useUnifiedTopology: true} إلى خطأ اتصال MongoDB: MongoTimeoutError: انتهت مهلة تحديد الخادم بعد 30000 مللي ثانية

تم إنشاؤها على ٢٠ سبتمبر ٢٠١٩  ·  78تعليقات  ·  مصدر: Automattic/mongoose

هل تريد طلب ميزة أو الإبلاغ عن خطأ ؟

حشرة.

ما هو السلوك الحالي؟

بعد التحديث إلى Mongoose 5.7.1 ، ظهر التحذير التالي:

(node:41563) DeprecationWarning: current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. To use the new Server Discover and Monitoring engine, pass option { useUnifiedTopology: true } to the MongoClient constructor.
    at parseFn (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/mongoose/node_modules/mongodb/lib/operations/connect.js:312:5)
    at parseConnectionString (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/mongoose/node_modules/mongodb/lib/core/uri_parser.js:628:3)
    at connect (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/mongoose/node_modules/mongodb/lib/operations/connect.js:266:3)
    at ConnectOperation.execute (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/mongoose/node_modules/mongodb/lib/operations/connect.js:191:5)
    at executeOperation (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/mongoose/node_modules/mongodb/lib/operations/execute_operation.js:83:26)
    at MongoClient.connect (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/mongoose/node_modules/mongodb/lib/mongo_client.js:216:10)
    at Promise (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/mongoose/lib/connection.js:632:12)
    at Promise._execute (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/bluebird/js/release/debuggability.js:313:9)
    at Promise._resolveFromExecutor (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/bluebird/js/release/promise.js:488:18)
    at new Promise (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/bluebird/js/release/promise.js:79:10)
    at NativeConnection.Connection.openUri (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/mongoose/lib/connection.js:629:19)
    at Mongoose.connect (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/mongoose/lib/index.js:327:15)
    at Object.connect (/Users/tschaffter/dev/PHCCollaborationPortal/server/app.js:17:44)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Module._compile (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/pirates/lib/index.js:99:24)
    at Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Object.newLoader [as .js] (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/pirates/lib/index.js:104:7)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Module.require (internal/modules/cjs/loader.js:692:17)
    at require (internal/modules/cjs/helpers.js:25:18)
    at Object.<anonymous> (/Users/tschaffter/dev/PHCCollaborationPortal/server/index.js:12:28)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)

لقد أضفت useUnifiedTopology: true إلى كائن تكوين النمس الخاص بي كما هو مقترح في الرسالة ، على الرغم من أنني لا أستخدم مجموعة نسخ MongoDB أو مجموعة مجزأة. إليك كيفية التكوين والاتصال باستخدام النمس:

مونجو: {
والخيارات: {
// https://mongoosejs.com/docs/deprecations.html
useNewUrlParser: صحيح ،
useFindAndModify: خطأ ،
useCreateIndex: صحيح ،
useUnifiedTopology: صحيح ،
إعادة الاتصال عدد المحاولات: 30 ،
إعادة الاتصال الفاصل الزمني: 500 ، // بالمللي ثانية
}
} ،

and here is where I used this `mongo.options` object:

// الاتصال بـ MongoDB
const mongooseConnectionPromise = mongoose.connect (config.mongo.uri ، config.mongo.options) ؛
mongoose.connection.on ('error'، err => {
خطأ وحدة التحكم ( MongoDB connection error: ${err} ) ؛
process.exit (-1) ؛ // eslint-disable-line no-process-exit
}) ؛

The warning is gone but the issue is that mongoose is now no longer able to connect:

خطأ اتصال MongoDB: MongoTimeoutError: انتهت مهلة تحديد الخادم بعد 30000 مللي ثانية
[nodemon] تعطل التطبيق - في انتظار تغييرات الملف قبل البدء ...

Here is how I run MongoDB using docker during development:

docker run -p $ {MONGO_PORT}: $ {MONGO_PORT} --name mongo -d mongo
""

إذا كان السلوك الحالي عبارة عن خطأ ، فيرجى تقديم خطوات إعادة الإنتاج.

أنظر فوق

ما هو السلوك المتوقع؟

يجب أن يزيل النمس تحذير الإيقاف ويعمل بشكل جيد عند استخدام useUnifiedTopology: true كما يقترح النمس.

ما هي إصدارات Node.js و Mongoose و MongoDB التي تستخدمها؟

العقدة: v10.16.2
النمس: 5.7.1 (الأحدث)
MongoDB: إصدار db v4.2.0

القضايا ذات الصلة:

can't reproduce

التعليق الأكثر فائدة

أهلا! اسمي مات وأنا في فريق السائقين في MongoDB. نحن آسفون جدًا لحالات الانقطاع التي واجهتموها جميعًا ، وأردت تقديم تحديث بسيط لهذه المشكلة:

نحن بصدد محاولة التخلص التدريجي من أنواع الطوبولوجيا القديمة التي تحولت إلى عملية جراحية للغاية. سيساعد التخلص التدريجي من هذه الأنواع على تقليل عبء الصيانة على السائق بشكل كبير ، ونأمل أن يعني ذلك وجود سائق أكثر استقرارًا وفعالية لمستخدمينا. على وجه الخصوص ، أثناء تقديم "الهيكل الموحد" ، لم نقدم أيضًا إعادة كتابة مجموعة الاتصال في محاولة لتقليل احتمالية حدوث خطأ. اتضح أن تجمع الاتصال كان أكثر ارتباطًا بأنواع الهيكل مما توقعنا ونتيجة لذلك شهدنا بعض الانحدارات ، خاصة حول مراقبة الخادم.

هذا الصباح ، قمت بدفع الإصدار 3.3.4-rc0 للسائق والذي يجب أن يعالج المشكلات التي كنت تواجهها. سنكون ممتنين للغاية إذا أمكنك تجربة هذا الإصدار وتقديم تقرير بتجربتك. لقد تركت تعليقات على كل من التذاكر الحالية المتعلقة بهذه المشكلة على NODE-2267 ، ولكن لا تتردد في فتح مشكلات إضافية هناك إذا واجهتها.

ال 78 كومينتر

ما صورة عامل الميناء التي تستخدمها؟ أيضًا ، هل لديك تتبع مكدس لرسالة "انتهت مهلة اختيار الخادم"؟

مرحبًا ، فقط بدس هنا للإبلاغ عن أن لدي نفس المشكلة.

أنا نفسي لا أستخدم Docker أو أي جهاز افتراضي. تجدر الإشارة أيضًا إلى أن هذا لا يبدو أنه يحدث طوال الوقت ، ولكن اليوم لم أتمكن من استعادة أي من بياناتي بسبب انتهاء المهلة (30 ألفًا) ، وتم حل المشكلة فورًا عند إزالة علامة useUnifiedTopology .

أنا أتصل بمجموعة أطلس.

النمس - 5.7.1
MongoDb هو 3.3.2
العقدة هي 12.9.1

ربط مثل هذا:

mongoose.createConnection(uri,
    {
        useCreateIndex: true,
        useNewUrlParser: true,
        useUnifiedTopology: true, // commented out currently
        dbName: db_name
    });

تم إنشاء النموذج على النحو التالي:

import mongoose from 'mongoose';
import * as db_conns from '../db-connections'; // this is an object of connections generated via createConnection

// ... schema definition, for a model called 'article' from a collection called 'article'

// `site_content` is the name of a connection
export default db_conns.connections.site_content.model(`article`, schema, `article`);

ثم يتم جلبه على النحو التالي:

// ...
await query.model.find(query_expr).limit(30); // query_expr can change, however even an empty expression ({}) will cause the same issue
// ...

توقف المكالمة find ويصدر خطأ المهلة.

@ vkarpov15 أنا أستخدم أحدث صورة mongo التي توفر MongoDB v4.2.0.
https://hub.docker.com/_/mongo

أتلقى أيضًا نفس الخطأ بعد إضافة {useUnifiedTopology: true} ، على الرغم من أن الخطأ يحدث بشكل عشوائي. هناك شيء خاطئ بالتأكيد. أنا أستخدم أحدث صورة mongo.

النمس
.connect (process.env.MONGO_URI، {
useUnifiedTopology: صحيح ،
useNewUrlParser: صحيح ،
})
.then (() => console.log ('DB Connected!'))
.catch (يخطئ => {
console.log (خطأ ، err.message) ؛
}) ؛
عندما تبدأ أحصل على وحدة التحكم:
[الوظيفة: خطأ] {stackTraceLimit: 16، PreparStackTrace: undefined} اتصال 0 إلى acccluster-shard-00-01-xx47j.mongodb. الصافي: 27017 مغلق

أي حلول؟ حتى أنا أواجه هذه المشكلة الآن ...

لدي نفس المشكلة. أنا مبرمج مبتدئ وهذه هي المرة الأولى التي أستخدم فيها nodejs-express-graphql-mongoose-mongodbAtlas.

(العقدة: 9392) UnhandledPromiseRejectionWarning: MongoTimeoutError: انتهت مهلة اختيار الخادم بعد 30000 مللي ثانية
في Timeout.setTimeout (MyAppPathgraphql2node_modulesmongodblibcoresdamtopology.js: 850: 16)
في وقت الخروج (timers.js: 436: 11)
في tryOnTimeout (timers.js: 300: 5)
في listOnTimeout (timers.js: 263: 5)
في Timer.processTimers (timers.js: 223: 10)
(العقدة: 9392) UnhandledPromiseRejectionWarning: رفض الوعد الذي لم تتم معالجته. نشأ هذا الخطأ إما عن طريق الرمي داخل دالة غير متزامنة بدون كتلة catch ، أو برفض وعد لم يتم التعامل معه باستخدام .catch (). (معرف الرفض: 1)
(العقدة: 9392) [DEP0018] تحذير الإيقاف: تم إهمال رفض الوعود غير المعالجة. في المستقبل ، ستؤدي حالات رفض الوعد التي لم تتم معالجتها إلى إنهاء عملية Node.js برمز إنهاء غير صفري.
Events.js: 174
رمي إيه ؛ // حدث "خطأ" غير معالج
^

خطأ: اقرأ ECONNRESET
في TLSWrap.onStreamRead (داخلي / stream_base_commons.js: 111: 27)
صدر حدث "خطأ" في:
في TLSSocket.(MyAppPathnode_modulesmongodblibcoreconnectionconnection.js: 321: 10)
في Object.onceWrapper (events.js: 286: 20)
في TLSSocket.emit (events.js: 198: 13)
في emitErrorNT (داخلي / تيارات / destruction.js: 91: 8)
في emitErrorAndCloseNT (داخلي / تيارات / تدمير.جس: 59: 3)
في process._tickCallback (داخلي / عملية / next_tick.js: 63:19)

نحصل أيضًا على نفس الخطأ على خادم الإنتاج بعد تمكين useUnifiedTopology .

MongoTimeoutError: Server selection timed out after 30000 ms
    at Timeout.setTimeout [as _onTimeout] (/opt/app/node_modules/mongodb/lib/core/sdam/topology.js:850:16)
    at ontimeout (timers.js:498:11)
    at tryOnTimeout (timers.js:323:5)
    at Timer.listOnTimeout (timers.js:290:5)

بدأت أواجه مشكلة أخرى الآن
MaxListenersExceededWarning: تم اكتشاف تسرب ذاكرة EventEmitter محتمل. 11 طوبولوجيا الوصف تمت إضافة المستمعين المتغيرة.

عندما بحثت عن هذا التحذير صادفت هذا المستند mongoDB
https://jira.mongodb.org/browse/NODE-2123

يذكر كلا من الأخطاء
"انتهت مهلة تحديد الخادم" بالإضافة إلى "MaxListenersExceededWarning" وكلتا الأخطاء ناتجة عن تغيير الهيكل الموحد. أعتقد أن هذا كان تغييرًا جذريًا لم يتم ذكره مطلقًا.

بما أنني أواجه هذا الخطأ على خادمي المباشر ، فليس لدي خيار سوى تعيين {useUnifiedTopology: false}. آمل أن يتمكن شخص ما من المجتمع من التركيز على هذه المشكلة وحلها أو تقديم بعض الاقتراحات لحلها.

أحصل أيضًا على كلا الخطأين ( انتهت مهلة اختيار الخادم بعد 30000 مللي ثانية و MaxListenersExceededWarning: تم اكتشاف تسرب ذاكرة EventEmitter محتمل. 11 ) عند استخدام useUnifiedTopology لذلك يحدث هذا لكل شخص يستخدم هذا الخيار على ما أعتقد.

لقد حاولت أن أعبر عن هذا ، لكنني لم أتمكن من التراجع. لقد جربت بعض الخيارات:

1) قتل الخادم مباشرة قبل الاستعلام

2) الاستعلام عن اتصال غير متصل

3) تنفيذ الاستعلام بنجاح

ما زلت لم أر رسالة الخطأ هذه على أي حال. هل يمكنك تعديل البرنامج النصي أدناه لتوضيح هذه المشكلة؟

'use strict';

const mongoose = require('mongoose');

run().catch(err => console.log(err));

async function run() {
  mongoose.set('useUnifiedTopology', true);
  mongoose.set('useNewUrlParser', true);

  await mongoose.connect('mongodb://localhost:27017/test');

  const Model = mongoose.model('Test', new mongoose.Schema({ name: String }));

  console.log('Query...');
  await Model.findOne();
  console.log('Done');
}

أو على الأقل تقديم بعض المعلومات حول إصدار Mongoose الذي تستخدمه ؛ سواء كنت تستخدم خادمًا مستقلًا أو مجموعة نسخ متماثلة أو مجموعة مجزأة ؛ وما إذا كنت تستخدم النمس مباشرة أو عبر وحدة npm أخرى؟

أنا مقتنع تمامًا أن هذه ليست مشكلة مع النمس ، ولكن مع مونجو نفسه.

@ vkarpov15 ، يرجى الاطلاع على تعليقي ، أوجز بيئتي هناك. أنا أستخدم النمس مباشرة.

@ vkarpov15 بالنسبة لي ، تظهر هذه المشكلة بشكل عشوائي كل 2-3 أيام عندما يكون الخادم قيد التشغيل ، لذا حتى لو قدمت لك الرمز ، فسيتعين عليك مراقبة الخادم باستمرار.

هل قام أي شخص بالتغلب على هذه القضية؟

هل قام أي شخص بالتغلب على هذه القضية؟

لا يمكنك استخدام هذه العلامة في الوقت الحالي. سيحذرك مونغو من أنه سيتم تعطيله في المستقبل أو شيء من هذا القبيل ولكن في الوقت الحالي يبدو أنه يحل هذه المشكلة تمامًا.

هل قام أي شخص بالتغلب على هذه القضية؟

لا يمكنك استخدام هذه العلامة في الوقت الحالي. سيحذرك مونغو من أنه سيتم تعطيله في المستقبل أو شيء من هذا القبيل ولكن في الوقت الحالي يبدو أنه يحل هذه المشكلة تمامًا.

عندما لا أستخدم العلم useUnifiedTopology: صحيح ، لدي هذا الخطأ وتوقف التطبيق ،
النمس veriosn: 5.7.4
Screenshot from 2019-10-10 11-07-11

يمكن تأكيد أن التعليق useUnifiedTopology يحل المشكلة في بنائي. يحدث أيضًا بطريقة عشوائية (على ما يبدو).

rpedroni للأسف ، هذا ليس لنا ...

يحدث هنا أيضًا. يستجيب خادم الإنتاج الخاص بنا بالرسالة التالية. أعتقد أنني سأعلق على useUnifiedTopology في الوقت الحالي

خيارات اتصال MongoDB

var options = {
    useCreateIndex: true,
    useNewUrlParser: true,
    useFindAndModify: false,
    useUnifiedTopology: true,
    promiseLibrary: global.Promise
};

سجل الخادم

MongoTimeoutError: Server selection timed out after 30000 ms 
Oct 16 12:56:31 app/web.1:     at Timeout.setTimeout (/app/node_modules/mongodb/lib/core/sdam/topology.js:850:16) 
Oct 16 12:56:31 app/web.1:     at Shim.applySegment (/app/node_modules/newrelic/lib/shim/shim.js:1424:20) 
Oct 16 12:56:31 app/web.1:     at Timeout.wrappedCallback [as _onTimeout] (/app/node_modules/newrelic/lib/shim/shim.js:1281:21) 
Oct 16 12:56:31 app/web.1:     at ontimeout (timers.js:436:11) 
Oct 16 12:56:31 app/web.1:     at tryOnTimeout (timers.js:300:5) 
Oct 16 12:56:31 app/web.1:     at listOnTimeout (timers.js:263:5) 
Oct 16 12:56:31 app/web.1:     at Timer.processTimers (timers.js:223:10) 

نحن نواجه هذه المشكلة أيضًا ولا نستخدم النمس. يبدو أن هناك مشكلة في برنامج تشغيل MongoDB لـ Node.js نفسها. تم الإبلاغ عن المشكلة أيضًا هنا https://jira.mongodb.org/browse/NODE-2249
يجب أن يضيف الإصدار 3.3.3 من برنامج التشغيل الذي تم نشره اليوم مزيدًا من التفاصيل إلى MongoTimeoutError . يوصى أيضًا بتحديث برنامج التشغيل بسبب خطأ في الإصلاح.

هذا الخطأ هو نتيجة لعدم قدرة برنامج التشغيل على الاتصال بخادم يلبي تفضيل القراءة لعملية معينة (أو الاتصال الأولي). قد يكون هذا لعدد من الأسباب ، بما في ذلك سلسلة الاتصال الخاصة بك غير صالحة أو أن العقد في المجموعة الخاصة بك معطلة. إذا قمت بالتحديث إلى أحدث إصدار من برنامج التشغيل v3.3.3 ، فإننا نقوم بتضمين حقل سبب جديد مع MongoTimeoutError والذي سيساعدنا في إجراء مزيد من التحقيق في مشكلتك. بالإضافة إلى ذلك ، يتضمن هذا الإصدار إصلاحًا للخلل قد ينتج عنه خطأ انتهاء المهلة عند الاتصال الأولي إذا لم يكن أي عضو من مجموعة متماثلة متاحًا. يرجى تحديث برنامج التشغيل الخاص بك ، وإعلامنا إذا كنت لا تزال تواجه هذه المشكلة.

مقتبس من https://jira.mongodb.org/browse/NODE-2249؟focusedCommentId=2485028&page=com.atlassian.jira.plugin.system.issuetabpanels٪3Acomment-tabpanel#comment -2485028

يحدث الشيء نفسه هنا في كل من التطوير والإنتاج ، والاتصال بـ Mongo Atlas :(

لديك أيضًا هذه المشكلة في الاتصال بـ mongodb Atlas. يحدث هذا عادةً بعد قيام أطلس بإعادة تشغيل الخادم أو تحديثه أو شيء من هذا القبيل.

لذلك ما زلت غير قادر على إعادة إنتاج هذا محليًا باستخدام مجموعة نسخ متماثلة. يستمر البرنامج النصي أدناه في تنفيذ الاستعلامات بنجاح حتى مع تجاوز فشل مجموعة النسخ المتماثلة أو إنهاء الأساسي. لا تحصل على أي أخطاء في مهلة اختيار الخادم:

'use strict';

const mongoose = require('mongoose');

run().catch(err => console.log(err));

async function run() {
  mongoose.set('useUnifiedTopology', true);
  mongoose.set('useNewUrlParser', true);

  await mongoose.connect('mongodb://localhost:27017,localhost:27018,localhost:27019/test?replicaSet=rs');

  const Model = mongoose.model('Test', new mongoose.Schema({ name: String }));


  while (true) {
    console.log(new Date(), 'Query...');
    await Model.findOne();
    await new Promise(resolve => setTimeout(resolve, 5000));
  }
} 

أفضل تخميني هو أن تفسير rvanmil صحيح. حاول الترقية إلى [email protected] (الذي

أيضًا ، هل يعرف أي شخص ما إذا كانت هناك طريقة لبدء إعادة التشغيل في Atlas؟ ربما تحدث هذه المشكلة فقط إذا كنت تستخدم Atlas؟

@ vkarpov15 أعتقد أنه يجب عليك إيقاف / استئناف الكتلة لبدء إعادة التشغيل. إنه ممكن فقط مع أحجام M10 +.
أتساءل أيضًا عما إذا كان هذا قد يكون مشكلة أطلس بدلاً من ذلك. لم أتمكن من اختبار برنامج تشغيل MongoDB المحدث حتى الآن ، لكنني سأبلغ هنا مرة أخرى بمجرد أن أفعل.

لدي أيضًا نفس المشكلة اليوم مع طبقة Atlas المجانية بغض النظر عن علامة useUnifiedTopology. الخطأ: MongoTimeoutError: Server selection timed out after 30000 ms

يمكنني الحصول على اتصال باستخدام خدمة MongoDB أخرى مثل mLab.

كنت أواجه نفس المشكلة وانتهى بي الأمر إلى أن أكون شيئًا غبيًا بعض الشيء ، لكنني سأشاركه على أي حال لأنه قد يساعد شخصًا ينتهي به الأمر هنا أيضًا.

لقد تحققت من حقل "السبب" في MongoTimeoutError وقال "خطأ MongoError: فشلت المصادقة غير الصحيحة."
هذا عندما أدركت أنني كنت أستخدم كلمة مرور mongoDB في سلسلة الاتصال الخاصة بي وليس كلمة مرور المستخدم.
الآن يعمل بشكل جيد.

إذا كنت تستخدم MongoDB Atlas ، فيجب عليك إضافة عنوان IP الخاص بك إلى القائمة البيضاء.

انتقل إلى Network Access ، وقم بتحرير عنوان IP الحالي وانقر على Allow Access from Anywhere.

أنا أواجه هذه المشكلة فقط أثناء استخدام أطلس. لقد حاولت إضافة 0.0.0.0/0 IP في القائمة البيضاء ولكنها أيضًا لم تنجح.

انا استخدم:

  • النمس: 5.7.6
  • العقدة: v10.16.3
  • فئة أطلس المجانية

تعذر التكاثر في خادم mongodb المحلي. هناك ، كل استعلام يعمل بنجاح.

هذا ليس له علاقة بالوصول. لدي وصول 0/0/0/0 وهذا يحدث
في كل مرة يتم إعادة تشغيل الخادم على أطلس. يمكنك استنساخه عن طريق إنشاء عقدة متعددة
الكتلة (m10 +) وتحديد وقت الصيانة المجدول. ثم تشغيل لفترة طويلة
تشغيل الخدمة ويجب أن ينتج الخطأ عند إعادة تشغيله.

في الأربعاء 23 أكتوبر 2019 الساعة 7:42 صباحًا محمد مزيد الإسلام ، <
[email protected]> كتب:

أنا أواجه هذه المشكلة فقط أثناء استخدام أطلس. لقد حاولت الإضافة
0.0.0.0/0 IP في القائمة البيضاء ولكنها أيضًا لم تعمل.

انا استخدم:

  • النمس: 5.7.6
  • العقدة: v10.16.3
  • فئة أطلس المجانية

تعذر التكاثر في خادم mongodb المحلي. هناك ، كل استعلام يعمل فقط
بنجاح.

-
أنت تتلقى هذا لأنك علقت.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/Automattic/mongoose/issues/8180؟email_source=notifications&email_token=AAUHUCYYQIQ5U42IBYT7CQTQQA2B7A5CNFSM4IYQ3ZB2YY3PNVWWK3TUL52GN4DFVREX
أو إلغاء الاشتراك
https://github.com/notifications/unsubscribe-auth/AAUHUCY5SNFGGCPTGW6GH5DQQA2B7ANCNFSM4IYQ3ZBQ
.

اعتدت أيضًا أن أعاني من هذه المشكلة. ولكن الآن بعد وضع كل من 0.0.0.0/0 وعنوان IP الخاص بي في القائمة البيضاء من أطلس يحل المشكلة.

~ هذه فقط مشكلة في MongoDB Atlas. ~

لدي بعض المشاكل في استخدام MongoDB Atlas.

لدي نفس المشكلة باستخدام MongoDB العادي.

لقد نجحت في إعادة إنتاج الحالة التي تسبب "MongoTimeoutError: انتهاء مهلة تحديد الخادم بعد 30000" باستخدام عامل إنشاء عامل الميناء.
https://github.com/anzairyo0127/mongodb-connection-bug

ابدأ هذا التطبيق أولاً

$ docker-compose up -d
$ docker-compose exec a mongo /tmp/conf/init.js
$ docker-compose exec node sh
$ npm i && npm run build
$ npm run start
> 0times
> waiting ....
> {_id: 5db27454b77b210040f2f84e, id: 1, text: 'hogehoge'}
> 1times
> waiting ....
> {_id: 5db27454b77b210040f2f84e, id: 1, text: 'hogehoge'}
> xtimes
> waiting ....
> {_id: 5db27454b77b210040f2f84e, id: 1, text: 'hogehoge'}
> ......



md5-cc5c53b3c0322ef988c85b63b4bb6c4e



$ docker-compose restart a b c



md5-788ff0ed4e46daf35b1b8594351b929f



> xtimes
> waiting ....
> (node: 4360) UnhandledPromiseRejectionWarning: MongoTimeoutError: Server selection timed out after 30000 ms
> at Timeout.setTimeout [as _onTimeout] (/var/work/node_modules/mongodb/lib/core/sdam/topology.js:878:9)
> at ontimeout (timers.js: 436: 11)
> at tryOnTimeout (timers.js: 300: 5)
> at listOnTimeout (timers.js: 263: 5)
> at Timer.processTimers (timers.js: 223: 10)
> (node: 4360) UnhandledPromiseRejectionWarning: Unhandled promise rejection.This error originated either by throwing inside of an> async function without a catch block, or by rejecting a promise which was not handled with .catch (). (rejection id: 1)
> (node: 4360) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that
> are not handled will terminate the Node.js process with a non-zero exit code.

@ anzairyo0127 هل يمكنك تجربة نفس الشيء مع أحدث مكتبة 3.3.3 mongodb؟

rvanmil يمكنني إعادة إنتاجه في الإصدار 3.3.3.

يبدو أن هذا الخطأ يحدث عندما يكون mongoDB في تكوين النسخ المتماثل ويتلقى أحد المثيلات (ربما المثيل الأساسي) أمرًا قبل أن ينخفض ​​أو بعد بدء تشغيله مباشرة.
أعتقد أن السبب وراء حدوث ذلك بشكل متكرر على MongoDB Atlas هو أن MongoDB Atlas يرسل بانتظام استعلامات إلى المجموعة للمراقبة.

أي حلول؟ هذه المشكلة هي ....

نفس المشكلة لأكثر من شهر ولم تحل بعد -_-

التحديث إلى [email protected] يحل

octavioamu هل يمكنك تقديم المزيد من التفاصيل؟ ما هو إصدار قاعدة بيانات MongoDB [الكتلة] الذي كنت تستخدمه قبل الإصدار 4.2؟ ما هو إصدار حزم mongoose و mongodb npm الذي تستخدمه وهل قمت بترقيتهما؟ منذ متى وأنت تشغل 4.2 لتكون واثقًا من حلها في هذا الإصدار؟

آسف لا أعرف ما هو الإصدار الذي تم تثبيته ، فمن المحتمل أن يكون إصدارًا قديمًا جدًا لأنني لم أعمل مع mongo لفترة من الوقت.
نسخة النمس في 5.7.7
كانت الرسالة دائمة بالنسبة لي وبمجرد أن قمت بتثبيت [email protected] (تم التثبيت عبر الشراب) توقفت الرسالة.

إذا قمت بتعيين {useUnifiedTopology: false} فسوف أحصل على فشل في المصادقة

(node:19948) UnhandledPromiseRejectionWarning: MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoError: Authentication failed.]

وإذا قمت بتعيين {useUnifiedTopology: true} ، فإنني أحصل على مهلة

(node:20213) UnhandledPromiseRejectionWarning: MongoTimeoutError: Server selection timed out after 30000 ms

كلمة المرور صحيحة بالتأكيد. يمكن إعادة إنتاج هذا على نظام محلي بأحدث إصدارات كل شيء و LST Node.js. ومع ذلك ، يبدو أن استخدام سلسلة الاتصال دون أي نوع من المصادقة يعمل محليًا. لذلك إذا قمت بتعيين على سبيل المثال const MONGODB_URI = "mongodb://localhost/fullstack" مشكلة المهلة تختفي. ربما هذه المشكلة لها علاقة بالمصادقة؟ إليك MWE الذي يعيد إنتاج المشكلة في الإعداد المحلي الخاص بي:

const mongoose = require('mongoose')
// const url = 'mongodb://fullstack:fullstack@localhost/fullstack'
const url = 'mongodb://localhost/fullstack'
console.log('Connection url = ', url, 'connecting')
mongoose.connect(url, { useNewUrlParser: true, useUnifiedTopology: true })
console.log('Connected.')
mongoose.connection.close()

لقد استخدمت أحدث صورة Docker لإعداد MongoDB.

يحدث هنا أيضًا. يستجيب خادم الإنتاج الخاص بنا بالرسالة التالية. أعتقد أنني سأعلق على useUnifiedTopology في الوقت الحالي

خيارات اتصال MongoDB

var options = {
    useCreateIndex: true,
    useNewUrlParser: true,
    useFindAndModify: false,
    useUnifiedTopology: true,
    promiseLibrary: global.Promise
};

سجل الخادم

MongoTimeoutError: Server selection timed out after 30000 ms 
Oct 16 12:56:31 app/web.1:     at Timeout.setTimeout (/app/node_modules/mongodb/lib/core/sdam/topology.js:850:16) 
Oct 16 12:56:31 app/web.1:     at Shim.applySegment (/app/node_modules/newrelic/lib/shim/shim.js:1424:20) 
Oct 16 12:56:31 app/web.1:     at Timeout.wrappedCallback [as _onTimeout] (/app/node_modules/newrelic/lib/shim/shim.js:1281:21) 
Oct 16 12:56:31 app/web.1:     at ontimeout (timers.js:436:11) 
Oct 16 12:56:31 app/web.1:     at tryOnTimeout (timers.js:300:5) 
Oct 16 12:56:31 app/web.1:     at listOnTimeout (timers.js:263:5) 
Oct 16 12:56:31 app/web.1:     at Timer.processTimers (timers.js:223:10) 

يحدث هنا أيضًا. يستجيب خادم الإنتاج الخاص بنا بالرسالة التالية. أعتقد أنني سأعلق على useUnifiedTopology في الوقت الحالي

خيارات اتصال MongoDB

var options = {
    useCreateIndex: true,
    useNewUrlParser: true,
    useFindAndModify: false,
    useUnifiedTopology: true,
    promiseLibrary: global.Promise
};

سجل الخادم

MongoTimeoutError: Server selection timed out after 30000 ms 
Oct 16 12:56:31 app/web.1:     at Timeout.setTimeout (/app/node_modules/mongodb/lib/core/sdam/topology.js:850:16) 
Oct 16 12:56:31 app/web.1:     at Shim.applySegment (/app/node_modules/newrelic/lib/shim/shim.js:1424:20) 
Oct 16 12:56:31 app/web.1:     at Timeout.wrappedCallback [as _onTimeout] (/app/node_modules/newrelic/lib/shim/shim.js:1281:21) 
Oct 16 12:56:31 app/web.1:     at ontimeout (timers.js:436:11) 
Oct 16 12:56:31 app/web.1:     at tryOnTimeout (timers.js:300:5) 
Oct 16 12:56:31 app/web.1:     at listOnTimeout (timers.js:263:5) 
Oct 16 12:56:31 app/web.1:     at Timer.processTimers (timers.js:223:10) 

أنا أستخدم أطلس mongo db ونواجه نفس المشكلة.

dub-tools-jobs: orders - error MongoTimeoutError: Server selection timed out after 30000 ms 
Oct 29 13:16:30 app/worker.1:      at Timeout.setTimeout [as _onTimeout] (/app/node_modules/mongoose/node_modules/mongodb/lib/core/sdam/topology.js:850:16) 
Oct 29 13:16:30 app/worker.1:     at ontimeout (timers.js:436:11) 
Oct 29 13:16:30 app/worker.1:     at tryOnTimeout (timers.js:300:5) 
Oct 29 13:16:30 app/worker.1:     at listOnTimeout (timers.js:263:5) 
Oct 29 13:16:30 app/worker.1:     at Timer.processTimers (timers.js:223:10) +2m

حدث كل هذا مع التعليق على useUnifiedTopology كما اقترحت إحدى التوصيات

// mongodb connections
var options = {
    useCreateIndex: true,
    useNewUrlParser: true,
    useFindAndModify: false,
    // useUnifiedTopology: true,      
    promiseLibrary: global.Promise
};

باستخدام أطلس النمس و mongoDB ، تأكد من أن الخيارات على هذا النحو:
mongoose.connect (DATABASE_URL، {useNewUrlParser: true، useUnifiedTopology: true})

بعد ذلك ، إذا ظهرت المهلة ، فأنت بحاجة إلى إدراج عنوان IP الخاص بك في القائمة البيضاء من mongoDB بالانتقال إلى الوصول إلى الشبكة في mongoDB

مثل الآخرين ، يتعطل هذا الخطأ تطبيقي كل بضعة أيام ويمكنني تأكيد أن هذا لا علاقة له بالوصول إلى عنوان IP أو إدراجه في القائمة البيضاء.

انا استخدم:

  • النمس: 5.7.6
  • العقدة: v10.16.3
  • فئة أطلس المجانية

في الوقت الحالي ، سأقوم بالتعليق على useUnifiedTopology: true أيضًا. يبدو أنه قد يكون مرتبطًا بـ Atlas أو mongo ، كما ذكر آخرون.

هذه مشكلة تتعلق بخوادم MongoDB لمجموعة النسخ المتماثلة ويتم العمل على حل هنا بواسطة مهندسي MongoDB

https://jira.mongodb.org/browse/NODE-2267

ربما يستطيع @ vkarpov15 إغلاق هذه المشكلة لأنه لا علاقة لها بالنمس.

عندما يتغير عنوان IP الحالي الخاص بك لسبب ما ، يفشل الاتصال ، يجب عليك تحريره في القائمة البيضاء للوصول إلى الشبكة واستخدام عنوان IP الحالي

أهلا! اسمي مات وأنا في فريق السائقين في MongoDB. نحن آسفون جدًا لحالات الانقطاع التي واجهتموها جميعًا ، وأردت تقديم تحديث بسيط لهذه المشكلة:

نحن بصدد محاولة التخلص التدريجي من أنواع الطوبولوجيا القديمة التي تحولت إلى عملية جراحية للغاية. سيساعد التخلص التدريجي من هذه الأنواع على تقليل عبء الصيانة على السائق بشكل كبير ، ونأمل أن يعني ذلك وجود سائق أكثر استقرارًا وفعالية لمستخدمينا. على وجه الخصوص ، أثناء تقديم "الهيكل الموحد" ، لم نقدم أيضًا إعادة كتابة مجموعة الاتصال في محاولة لتقليل احتمالية حدوث خطأ. اتضح أن تجمع الاتصال كان أكثر ارتباطًا بأنواع الهيكل مما توقعنا ونتيجة لذلك شهدنا بعض الانحدارات ، خاصة حول مراقبة الخادم.

هذا الصباح ، قمت بدفع الإصدار 3.3.4-rc0 للسائق والذي يجب أن يعالج المشكلات التي كنت تواجهها. سنكون ممتنين للغاية إذا أمكنك تجربة هذا الإصدار وتقديم تقرير بتجربتك. لقد تركت تعليقات على كل من التذاكر الحالية المتعلقة بهذه المشكلة على NODE-2267 ، ولكن لا تتردد في فتح مشكلات إضافية هناك إذا واجهتها.

أستطيع أن أؤكد أن 3.3.4-rc0 قد أصلحت المشكلة 👍 سأقدم نتائج اختبار أكثر تفصيلاً لاحقًا.

بعد أن قمت بتغيير إصدار mongodb الخاص بي في package.json إلى
"mongodb": "3.3.4-rc0"،
أحصل دائمًا على خطأ (لا يحدث هذا الخطأ عندما يكون إصدار mongodb في 3.3.3):

===============================================
npm خطأ! path / tmp / app / node_modules / npm / node_modules / abbrev
npm خطأ! كود ENOENT
npm خطأ! يخطئ -2
npm خطأ! إعادة تسمية syscall
npm خطأ! Enoent Enoent: لا يوجد مثل هذا الملف أو الدليل ، أعد تسمية '/ tmp / app / node_modules / npm / node_modules / abbrev' -> '/tmp/app/node_modules/npm/node_modules/.abbrev.DELETE'
npm خطأ! enoent هذا مرتبط بعدم تمكن npm من العثور على ملف.
npm خطأ! enoent
npm خطأ! يمكن العثور على سجل كامل لهذا التشغيل في:
npm خطأ! /home/vcap/.npm/_logs/2019-11-06T17_19_55_661Z-debug.log
[31 ؛ خطأ 1m [0m تعذر إنشاء التبعيات: حالة الخروج 254
فشل تجميع droplet الصغير: فشل تشغيل كافة البرامج النصية للإمداد: حالة الخروج 14
حالة الخروج 223

===================================
إصدار npm الخاص بي هو npm في 6.11.3.

هل يرتبط هذا الخطأ بهذا الإصدار الجديد من mongodb v3.3.4-rc0؟

zhenwan يبدو أن هذا مشكلة في تنزيل الحزمة abbrev . أعتقد أن هناك مشكلات في package-lock.json الخاص بك ، يرجى محاولة حذف هذا الملف وتشغيل npm install مرة أخرى.

تمكنت من إعادة إنتاج الخطأ والتحقق مما إذا كان قد تم حله باستخدام برنامج التشغيل v3.3.4-rc0 باستخدام الإعداد التالي:

  • يعرض خادم الويب Node.js واجهة http بسيطة GET /api/todos تستعلم عن مجموعة MongoDB todo التي تحتوي على بعض نماذج البيانات
  • البرنامج النصي الذي يستدعي واجهة برمجة التطبيقات كل 500 مللي ثانية تعمل محليًا على جهازي
  • بمجرد تشغيل البرنامج النصي ، قم بتشغيل تجاوز الفشل (إعادة تشغيل الأساسي) على MongoDB (في Atlas ، تمكنت من القيام بذلك على مجموعة M10 عن طريق تحديد خيار القائمة "اختبار تجاوز الفشل")

كانت نتائج هذا الاختبار على النحو التالي:

✅ Mongodb Node.js 3.3.2 useUnifiedTopology false

> MongoDB failover triggered
> MongoDB 'reconnect' event
> A few http calls with +/- 5000ms response times
> MongoDB failover finished
> Everything back to normal

❌ Mongodb Node.js 3.3.2 useUnifiedTopology true

> MongoDB failover triggered
> MongoDB 'close' event
> Many MongoNetworkError errors
    {
      "name": "MongoNetworkError",
      "stack": "Error: connect ECONNREFUSED <ip_redacted>:27017
          at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1128:14)",
      "errorLabels": [
        "TransientTransactionError"
      ]
    }
> EventEmitter memory leak warning
    (node:18) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 topologyDescriptionChanged listeners added to [NativeTopology]. Use emitter.setMaxListeners() to increase limit
> Many MongoTimeoutError errors
    {
      "name": "MongoTimeoutError",
      "stack": "MongoTimeoutError: Server selection timed out after 30000 ms
          at Timeout._onTimeout (/app/node_modules/mongodb/lib/core/sdam/topology.js:850:16)
          at listOnTimeout (internal/timers.js:531:17)
          at processTimers (internal/timers.js:475:7)"
    }
> MongoDB failover finished
> Server unable to recover MongoDB connection
> Server restarted manually
> Everything back to normal

⚠️ Mongodb Node.js 3.3.4-rc0 useUnifiedTopology true

> MongoDB failover triggered
> MongoDB 'reconnect' event expected but not seen
> A few http calls with +/- 5000ms response times
> A couple failed http calls:
    {
      "name": "MongoError",
      "stack": "MongoError: Cache Reader No keys found for HMAC that is valid for time: { ts: Timestamp(1573064656, 1) } with id: 6756219367492419585
          at Connection.<anonymous> (/app/node_modules/mongodb/lib/core/connection/pool.js:451:61)
          at Connection.emit (events.js:210:5)
          at processMessage (/app/node_modules/mongodb/lib/core/connection/connection.js:368:10)
          at TLSSocket.<anonymous> (/app/node_modules/mongodb/lib/core/connection/connection.js:537:15)
          at TLSSocket.emit (events.js:210:5)
          at addChunk (_stream_readable.js:308:12)
          at readableAddChunk (_stream_readable.js:289:11)
          at TLSSocket.Readable.push (_stream_readable.js:223:10)
          at TLSWrap.onStreamRead (internal/stream_base_commons.js:182:23)",
      "ok": 0,
      "errmsg": "Cache Reader No keys found for HMAC that is valid for time: { ts: Timestamp(1573064656, 1) } with id: 6756219367492419585",
      "code": 211,
      "codeName": "KeyNotFound"
    }
> MongoDB failover finished
> Everything back to normal

لذلك يبدو أنه يعمل مع v3.3.4-rc0 ، فإن الخادم قادر على استعادة الاتصال واستئناف خدمة البيانات من MongoDB. على الرغم من ذلك ، لا تزال هناك مشكلتان:

  • يبدو أن حدث "إعادة الاتصال" مفقود
  • فشل طلبان مع ظهور رسالة الخطأ "Cache Reader لم يتم العثور على مفاتيح لـ HMAC الصالحة للوقت"

mbroadst نعم ، أدى حذف package-lock.json إلى حل مشكلة الملف المفقود.

لكن ما زلت أتلقى الخطأ:
2019-11-06T12: 52: 10.35-0600 [CELL / 0] أصبحت حاوية OUT صحية
2019-11-06T12: 52: 39.06-0600 [APP / PROC / WEB / 0] ERR /home/vcap/app/node_modules/connect-mongo/src/index.js:135
2019-11-06T12: 52: 39.06-0600 [APP / PROC / WEB / 0] خطأ رمي خطأ
2019-11-06T12: 52: 39.06-0600 [APP / PROC / WEB / 0] ERR ^
2019-11-06T12: 52: 39.06-0600 [APP / PROC / WEB / 0] خطأ خطأ: انتهت مهلة اختيار الخادم بعد 30000 مللي ثانية
2019-11-06T12: 52: 39.06-0600 [APP / PROC / WEB / 0] ERR في Timeout.setTimeout [as _onTimeout] (/ home / vcap / app / node_modules / connect-mongo / node_modules / mongodb / lib / core /sdam/topology.js:878:9)
2019-11-06T12: 52: 39.06-0600 [APP / PROC / WEB / 0] خطأ في وقت الخروج (timers.js: 469: 11)
2019-11-06T12: 52: 39.06-0600 [APP / PROC / WEB / 0] خطأ في tryOnTimeout (timers.js: 304: 5)
2019-11-06T12: 52: 39.06-0600 [APP / PROC / WEB / 0] خطأ في Timer.listOnTimeout (timers.js: 264: 5)
2019-11-06T12: 52: 39.35-0600 [APP / PROC / WEB / 0] حالة الخروج 1

zhenwan ، يبدو أنه قد يكون مرتبطًا بعدم القدرة على الاتصال بالمجموعة عند الاتصال الأولي. أيضًا ، لا يشير التتبع الخلفي إلى topology.js:878 إلى مكان حدث فيه خطأ ، كما أنك لا تتلقى النوع الصحيح MongoTimeoutError .

هل يمكنك من فضلك فتح تذكرة جيرا جديدة حتى نتمكن من فرز حالتك الخاصة. يبدو أننا سنحتاج إلى تفاصيل أكثر مما قمت بلصقه هنا. شكرا لك!

تضمين التغريدة
شكرا للمساعدة في حل المشكلة. أريد فقط أن أقول ، استخدام v3.3.4-rc0 لا يحل مشكلتي. ما زلت أتلقى هذه الرسالة

MongoTimeoutError: Server selection timed out after 30000 ms
    at Timeout.setTimeout (api/node_modules/mongodb/lib/core/sdam/topology.js:899:9)
    at ontimeout (timers.js:498:11)
    at tryOnTimeout (timers.js:323:5)
    at Timer.listOnTimeout (timers.js:290:5)

في حالتي ، أنا أستخدم loopback-connector-mongodb ، لكنني قمت بإعداد package.json لفرض استخدام الإصدار الأخير من mongodb في resolutions النحو التالي

"resolutions": {
    "mongodb": "^3.3.4-rc0"
  }

معلمات الاتصال الخاصة بي على النحو التالي

"host": "127.0.0.1",
 "port": 27017,
"database": "***",
"password": "***",
"user": "***",
"authSource": "***",
"useNewUrlParser": true,
"enableGeoIndexing": true

فيما يلي معلمات بيئتي

MongoDB server version: 3.6.3 on localhost
yarn v1.19.1
node v8.16.2 

شكرا لك مقدما

تحديث
حاولت أيضًا إضافة useUnifiedTopology: true إلى معلمات الاتصال ، لكنني حصلت على نفس النتيجة.

تأكيد آخر هنا ، من شخص يستخدم النمس مباشرة ، أن useUnifiedTopology: false يناسبني.

mbroadst أشكرك على التحديث من نهاية

mmmmoj مشابه لسؤالzhenwan أعلاه ، يبدو أن تتبع المكدس الخاص بك يشير إلى أنك لا تقوم في الواقع بتشغيل v3.3.4-rc0. ربما تحاول إزالة الخاص بك package-lock.json ؟ هل يمكنك تقديم تذكرة Jira حتى نتمكن من الخوض في تفاصيل قضيتك.

bigsee (لا يحب الرجل GitHub الإكمال التلقائي لاسمك!) سعيد لسماع أنه يعمل من أجلك ، وأنت مرحب بك في التحديث - مجتمعنا مهم جدًا بالنسبة لنا. سأترك @ vkarpov15 يتحدث عن توقيت الإصدار ، لكننا نعمل عن كثب وأنا متأكد من أنه مهتم بإصلاح ذلك من أجلكم :)

تضمين التغريدة
انتهى! شكرا
عقدة -2313

تضمين التغريدة آسف على الاسم المحرج!

اتضح أنني ربما تحدثت في وقت مبكر جدًا ، ربما نظرًا للطبيعة العشوائية للخطأ الذي ظهر. في البداية الباردة لتطبيقي ، جنبًا إلى جنب مع تحذير الإيقاف المتوقع ، أرى الآن هذا الخطأ المروع قليلاً في السجلات:

Unhandled rejection: { MongoNetworkError: failed to connect to server [myserver.mlab.com:55841] on first connect [{ MongoNetworkError: connection 0 to myserver.mlab.com:55841 timed out
    at Socket.<anonymous> (/var/task/node_modules/mongodb/lib/core/connection/connection.js:335:7)
    at Object.onceWrapper (events.js:313:30)
    at emitNone (events.js:106:13)
    at Socket.emit (events.js:208:7)
    at Socket._onTimeout (net.js:420:8)
    at ontimeout (timers.js:482:11)
    at tryOnTimeout (timers.js:317:5)
    at Timer.listOnTimeout (timers.js:277:5) name: 'MongoError', [Symbol(mongoErrorContextSymbol)]: {} }]
    at Pool.<anonymous> (/var/task/node_modules/mongodb/lib/core/topologies/server.js:431:11)
    at emitOne (events.js:116:13)
    at Pool.emit (events.js:211:7)
    at connect (/var/task/node_modules/mongodb/lib/core/connection/pool.js:580:14)
    at callback (/var/task/node_modules/mongodb/lib/core/connection/connect.js:109:5)
    at provider.auth.err (/var/task/node_modules/mongodb/lib/core/connection/connect.js:352:21)
    at _authenticateSingleConnection (/var/task/node_modules/mongodb/lib/core/auth/auth_provider.js:66:11)
    at sendAuthCommand (/var/task/node_modules/mongodb/lib/core/auth/scram.js:177:16)
    at Connection.errorHandler (/var/task/node_modules/mongodb/lib/core/connection/connect.js:321:5)
    at Object.onceWrapper (events.js:317:30)
    at emitTwo (events.js:126:13)
    at Connection.emit (events.js:214:7)
    at Socket.<anonymous> (/var/task/node_modules/mongodb/lib/core/connection/connection.js:333:10)
    at Object.onceWrapper (events.js:313:30)
    at emitNone (events.js:106:13)
    at Socket.emit (events.js:208:7)
  name: 'MongoNetworkError',
  errorLabels: [ 'TransientTransactionError' ],
  [Symbol(mongoErrorContextSymbol)]: {} }

كان من المعتاد أن يكون MongoTimeoutError ولكنه الآن MongoNetworkError ... ... أي أفكار؟

bigsee أن الخطأ يشير إلى أنك لا تستخدم الهيكل الموحد. يرجى تمكينه بتمرير useUnifiedTopology: true إلى MongoClient الخاص بك

mbroadst هذا صحيح ، وأعتقد أن هذا هو الهدف من هذه المشكلة. أعتذر إذا كنت مخطئا في ذلك.

عندما أجتاز useUnifiedTopology: true ، يختفي تحذير الإيقاف ولكن تطبيقي يتعطل بشكل عشوائي مع ظهور الخطأ في عنوان هذه المشكلة MongoTimeoutError: Server selection timed out after 30000 ms .

كما هو الحال مع @ vkarpov15 وغيره أعلاه ، لم أتمكن من إعادة إنتاج هذه المشكلة باستمرار. يحدث الخطأ عدة مرات في اليوم مما يؤدي إلى 502 و UX فظيع من وقت لآخر. يبدو أنها مشكلة جديدة.

كما هو مذكور أعلاه ، فإن الحل البديل لإعداد useUnifiedTopology: false (أو التعليق) يمنع الخطأ في هذه المشكلة ، لكنه يستعيد تحذير الإهمال والآن هو MongoNetworkError المروع قليلاً أعلاه. جانبا ، هذا لا يقتل تطبيقي في الواقع ولكنه يقلقني أنه سيفعل ذلك للمستخدم في مرحلة ما.

bigsee the MongoNetworkError الذي تواجهه ليس جديدًا ، وهذا يعني أن السائق لم يكن قادرًا على إجراء اتصال أولي بالعنقود (بالمناسبة إذا كان هناك نوع من حالة السباق بين بدء تشغيل تطبيقك وبدء المجموعة الخاصة بك هذا ، إذن يجب أن تساعد الطوبولوجيا الموحدة هنا أيضًا).

الهدف من هذه المشكلة هو أن الأشخاص كانوا يتبعون الإرشادات لاستخدام الهيكل الموحد ، وعندما فعلوا كانوا يواجهون أخطاء مهلة زائفة. v3.3.4-rc0 لمعالجة هذه المشكلة المحددة ، لذا فإن التوجيه الحالي هو استخدام هذا الإصدار الذي يجب أن يزيل إشعار الإيقاف ويصحح مشكلات المهلة الزائفة التي واجهها الأشخاص.

يجب أن أقول أيضًا: هذا الإصدار لن يمنع _all_ أخطاء المهلة. يحدث هذا الخطأ بسبب عدم قدرة برنامج التشغيل على إجراء اتصال أولي بمجموعة ، مما قد يشير إلى نوع من التكوين (سلسلة الاتصال) أو خطأ في الشبكة من جانبك. مع الهيكل الموحد ، سيظهر هذا كحقل MongoTimeoutError مع حقل reason يشير إلى خطأ الشبكة الذي تسبب في انتهاء المهلة عند الاتصال الأولي.

mbroadst لم أقصد أن أقترح أن MongoNetworkError كان جديدًا في تعليقي الأخير ، لذا أعتذر إذا كانت هذه هي الطريقة التي تمت قراءتها. إنه خطأ MongoTimeoutError الجديد. لأكون أكثر وضوحًا ، كانت هذه عمليتي:

  1. تم تكوين التطبيق بـ useUnifiedTopology: true - كل شيء يعمل كما هو متوقع
  2. يبدأ التطبيق في التعطل بشكل عشوائي ويقدم مع MongoTimeoutError يطابق عنوان هذه المشكلة ، بالإضافة إلى الأسطر القليلة الأولى من تتبع المكدس المعروض أعلاه
  3. بحث Google / SO يقودني في النهاية إلى هنا
  4. أنا استخدم الحل البديل المقترح useUnifiedTopology: false
  5. يختفي الخطأ MongoTimeoutError مع تعطل التطبيق. ومع ذلك ، يتم استبداله بتحذير الإهمال في البداية. ثم ، لاحقًا ، بواسطة MongoNetworkError إضافي لم يظهر في التطبيق قبل تعيين useUnifiedTopology: false

ربما ، كما تقترح ، هذا هو الارتباط وليس السببية. بدا لي وكأنه مسدس دخان. على الأقل التطبيق لا يتعطل الآن. أنا قلق فقط بشأن ترك خيار تم إهماله.

تضمين التغريدة عذرًا ، لقد أخطأت في قراءة تعليقك الأصلي ليعني أنك كنت تؤكد أن إصلاحات الأخطاء v3.3.4-rc0 حلت مشكلاتك من v3.3.3 . هل سنحت لك الفرصة لتجربة الإصدار الجديد؟

هذه أول تجربة لي على Mongodb وأواجه هذا الخطأ. قراءة التعليقات وتغيير db الخاص بي إلى v3.3.4-rc0 ولم يصلح الخطأ بعد

تحذير: تم إهمال محرك اكتشاف ومراقبة الخادم الحالي ، وستتم إزالته في إصدار مستقبلي. لاستخدام محرك اكتشاف ومراقبة الخادم الجديد ، مرر الخيار {useUnifiedTopology: true} إلى المنشئ MongoClient.
MongoNetworkError: فشل الاتصال بالخادم [cluster0-shard-00-00-rhdve.mongodb. net: 27017 ] عند الاتصال الأول [MongoNetworkError: اتصال 3 بالكتلة 0-shard-00-00-rhdve.mongodb. الصافي: 27017 مغلق
في TLSSocket.(C: LaragonwwwVue-express-mongodbnode_modulesmongodblibcoreconnectionconnection.js: 356: 9)
في Object.onceWrapper (events.js: 297: 20)
في TLSSocket.emit (events.js: 209: 13)
على net.js: 588: 12
في TCP.done (_tls_wrap.js: 479: 7) {
الاسم: "MongoNetworkError" ،
errorLabels: [صفيف] ،
}]
في بركة.(C: LaragonwwwVue-express-mongodbnode_modulesmongodblibcoretopologiesserver.js: 433: 11)
في Pool.emit (events.js: 209: 13)
في C: LaragonwwwVue-express-mongodbnode_modulesmongodblibcoreconnectionpool.js: 562: 14
في C: LaragonwwwVue-express-mongodbnode_modulesmongodblibcoreconnectionpool.js: 999: 9
عند رد الاتصال (C: LaragonwwwVue-express-mongodbnode_modulesmongodblibcoreconnectionconnect.js: 109: 5)
في C: LaragonwwwVue-express-mongodbnode_modulesmongodblibcoreconnectionconnect.js: 129: 7
في Connection.errorHandler (C: laragonwwwVue-express-mongodbnode_modulesmongodblibcoreconnectionconnect.js: 321: 5)
في Object.onceWrapper (events.js: 297: 20)
في Connection.emit (events.js: 209: 13)
في TLSSocket.(C: laragonwwwVue-express-mongodbnode_modulesmongodblibcoreconnectionconnection.js: 354: 12) {
الاسم: "MongoNetworkError" ،
تصنيفات الخطأ: ['TransientTransactionError'] ،
}
TypeError: لا يمكن قراءة خاصية 'find' من undefined
في C: LaragonwwwVue-express-mongodbserverroutesapiposts.js: 12: 26

@ Syfon01 الخطأ الذي mongo shell). إذا كنت لا تزال تواجه مشكلات ، فالرجاء فتح تذكرة jira حتى نتمكن من متابعة المحادثة هناك ، وعدم إرباك الأشخاص الذين ينظرون إلى مشكلة GitHub هذه

بالنسبة للأشخاص الذين يواجهون هذه المشكلة ، إذا كنت تستخدم Mongo Atlas Cloud Instance ، فيرجى معرفة ما إذا كان عنوان IP الخاص بك محددًا بشكل صحيح في علامة التبويب Network Access.

لقد واجهت المشكلة ويبدو أنه نظرًا لأن مزود خدمة الإنترنت الخاص بي يقدم عناوين IP جديدة في كل مرة (DHCP) أقوم بإعادة الاتصال بالشبكة ، فإن Mongo Atlas كان يسرد عنوان IP المحدد مسبقًا فقط. أمل أن هذا يساعد شخصاما.

التحديث - لا يعمل

تمكنت من حل هذه المشكلة عن طريق تغيير بنية الكود الخاص بي ، وتحديداً رد الاتصال على النحو التالي:

mongoose.connect(DATABASE_URL, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
}).then(() => {
    console.log('Connected to DB');
    app.listen({ port: PORT }, () => {
        console.log(`Server running at http://localhost:${PORT}`)
    });
}).catch(err => console.log(err));
mongoose.connect(DATABASE_URL, { 
    useNewUrlParser: true, 
    useUnifiedTopology: true,
}, () => {
    console.log('Connected to DB');
    app.listen({ port: PORT }, () => {
        console.log(`Server running at http://localhost:${PORT}`);
    });
}).catch(err => console.log(err));

@ mtn2bay الذي لا معنى له أنك استخدمت بشكل أساسي وظيفة رد الاتصال بدلاً من الوعد ، والنتيجة لا تزال واحدة ، والفرق الوحيد هو أنه في وظيفة رد الاتصال تحصل على كل من الاتصال والخطأ في وظيفة رد الاتصال التي لا تقوم بتسجيلها بدلاً من الاعتماد عليها. ثم ، و. التقاط ، لذا فإن وظيفتك تقوم بتسجيل الدخول إلى db وبدء تشغيل التطبيق في كلتا الحالتين حتى إذا كان هناك خطأ. جرب هذا بدلا من ذلك

mongoose.connect(DATABASE_URL, { 
    useNewUrlParser: true, 
    useUnifiedTopology: true,
}, (err, connection) => {
if(err) {
console.error(err)
return
}    
console.log('Connected to DB');
    app.listen({ port: PORT }, () => {
        console.log(`Server running at http://localhost:${PORT}`);
    })

khaledosman شكرا على التصحيح. أنت محق ، لقد كنت أتجاهل الخطأ فقط بدلاً من معالجته. في الواقع كان لدي مشكلة مع مسار ديسيبل الخاص بي.

كنت أواجه نفس المشكلة ، لقد قمت بتحديث حزمة npm mongoose من 5.6.9 إلى 5.7.6 واختفت المشكلة.

بالنسبة للأشخاص الذين يواجهون هذه المشكلة ، إذا كنت تستخدم Mongo Atlas Cloud Instance ، فيرجى معرفة ما إذا كان عنوان IP الخاص بك محددًا بشكل صحيح في علامة التبويب Network Access.

لقد واجهت المشكلة ويبدو أنه نظرًا لأن مزود خدمة الإنترنت الخاص بي يقدم عناوين IP جديدة في كل مرة (DHCP) أقوم بإعادة الاتصال بالشبكة ، فإن Mongo Atlas كان يسرد عنوان IP المحدد مسبقًا فقط. أمل أن هذا يساعد شخصاما.

حل مشكلتي
UnhandledPromiseRejectionWarning: MongoTimeoutError: Server selection timed out after 30000 ms at Timeout.setTimeout (C:\Users\Umer MIB\Desktop\Chatbots2\mongobot\node_modules\mongodb\lib\core\sdam\topology.js:878:9) at ontimeout (timers.js:436:11) at tryOnTimeout (timers.js:300:5) at listOnTimeout (timers.js:263:5) at Timer.processTimers (timers.js:223:10) (node:4304) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1) (node:4304) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code

لا أعرف كيف أدى ذلك إلى حل مشكلة ، لكنني قمت بتنزيل Compass وربطته بقاعدة البيانات ، فقط قمت بنسخ الرابط. بمجرد الاتصال ، ذهب الخطأ. الطبولوجيا لا تزال صحيحة في الكود الخاص بي. ربما قام بتكوين بعض الخيارات باستخدام Compass التي لم تكن صحيحة مع التثبيت العادي mongodb. الآن يمكنني الاتصال بدون البوصلة ويبدو أن كل شيء يعمل ، لقد قمت بذلك مرة واحدة في البداية.

حصلت على نفس المشكلة وبفضل هذا المنتدى ، مررت بالتعليق على وضع useUnifiedTopology. ومع ذلك ، فقد قمت بإلغاء تعليق هذا الإعداد ، لكنه الآن لا يزال يعمل بشكل جيد ... مرتبك تمامًا ...

يستخدم Mongoose v5.7.11 الإصدار الجديد من برنامج التشغيل MongoDB 3.3.4 ، لذلك سأقوم بإغلاق هذه المشكلة. إذا تلقيت رسالة خطأ مماثلة ، فيرجى فتح مشكلة جديدة واتباع نموذج المشكلة.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات