Mongoose: تحذير الإيقاف: "open ()` مهمل في mongoose> = 4.11.0 ، استخدم `openUri ()` بدلاً من ذلك

تم إنشاؤها على ٢٥ يونيو ٢٠١٧  ·  158تعليقات  ·  مصدر: Automattic/mongoose

تحذير: تم إهمال open() في النمس> = 4.11.0 ، استخدم openUri() بدلاً من ذلك ، أو اضبط الخيار useMongoClient في حالة استخدام connect() أو createConnection()

Mongoose 4.11.0 ، MongoDB 2.2.29 ، NodeJS 8.1.2

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

أسهل حل لهذا ؛ تم حل مشكلة " npm remove mongoose " ثم " npm install [email protected] --save ". الترقية ليست دائما الخيار الأفضل.

ال 158 كومينتر

+1 ، ليس لدي أي فكرة عن مكان الإصلاح للتخلص من هذا التحذير

التحذير هو رمز داخل Mongoose في الواقع ، عندما تحتوي سلسلة متصلة على مجموعة متماثلة:

Mongoose.prototype.connect = function() {
  var conn = this.connection;
  if ((arguments.length === 2 || arguments.length === 3) &&
      typeof arguments[0] === 'string' &&
      typeof arguments[1] === 'object' &&
      arguments[1].useMongoClient === true) {
    return conn.openUri(arguments[0], arguments[1], arguments[2]);
  }
  if (rgxReplSet.test(arguments[0]) || checkReplicaSetInUri(arguments[0])) {
    return new MongooseThenable(this, conn.openSet.apply(conn, arguments));
  }

  return new MongooseThenable(this, conn.open.apply(conn, arguments));
};

تضمين التغريدة

إذن ، هذا هو الخطأ؟

يبدو وكأنه خطأ ، هل يمكننا الحل عن طريق إضافة useMongoClient: true إلى الخيارات (قد ترى إهمالًا من برنامج تشغيل MongoDB بعد ذلك ولكن هذا لا يطرح)

تؤدي إضافة useMongoClient: true إلى اختفاء الرسالة ، ولكن يتوقف تحميل المستندات الخاصة بي بعد ذلك. لم أقم بتنقيحها بشكل أعمق ، لكنني أفضل الاستماع إلى أفضل الممارسات أولاً قبل تعديل الكود الخاص بي.

لا يعمل تطبيقي أيضًا مع الحل البديل المقترح أعلاه. إنه ببساطة لا يشغل طريقة MyModel.find بعد الآن ولا يعطي أي خطأ ولا مهلة.

السبب وراء عدم عمل خيار "useMongoclient: true" في معظم الحالات هو لهذا الخيار ، فكل كائن مرتبط بالاتصال النمطي يُرجع كائنًا وهميًا يتسبب في عدم القدرة على الوصول إلى mongodb

حاولت استخدامه مثل

const server = express();
mongoose.connect('mongodb://localhost/advisorDemoTestDB', { useMongoClient: true })
    .then(() => require('./db-init')(server))
    .catch(err => console.error(err));

لكنها لا تعمل

وجود نفس المشكلة ، حتى بدون مجموعات النسخ المتماثلة.

تواجه نفس المشكلة:

(node:4138) DeprecationWarning: `open()` is deprecated in mongoose >= 4.11.0,
 use `openUri()` instead, or set the `useMongoClient` option if using `connect()` 
or `createConnection()`

نفس...

بعد أن أضفت الكود أدناه إلى اتصال mongo الخاص بي ، لا يمكنني الاستعلام عن أي شيء الآن.
{useMongoClient: صحيح}.
أي اقتراحات سيكون موضع تقدير !!

+1 نفسه مع مجموعات النسخ المتماثلة ، بدون تقسيم

+1

+1

+1

+1

+1

+1

+1

أسهل حل لهذا ؛ تم حل مشكلة " npm remove mongoose " ثم " npm install [email protected] --save ". الترقية ليست دائما الخيار الأفضل.

+1

+1

تلقيت رسالتين:

(node:9260) DeprecationWarning: `open()` is deprecated in mongoose >= 4.11.0,
use `openUri()` instead, or set the `useMongoClient` option if using `connect()`
or `createConnection()`

Server started on port 3000

Db.prototype.authenticate method will no longer be available in the next major
release 3.x as MongoDB 3.6 will only allow auth against users in the admin db
and will no longer allow multiple credentials on a socket. Please authenticate
using MongoClient.connect with auth credentials.

ظهر الخطأ الأول في 4.11.0. ظهر الخطأ الثاني أيضًا في الإصدار السابق من النمس.

plhosk ، الثاني كان يجب أن يتم إصلاحه في 4.11 ولكن يبدو أنه لا يزال موجودًا ، بالنسبة لي أيضًا.

+1

+1 للأسف.

تم تثبيت 4.10.8 دون مشاكل. يُرجى مراعاة تغيير npm install mongoose --save إلى الإعداد الافتراضي 4.10.8 حتى يصبح 11 مستقرًا.

+1

+1

+1

+1

لقد وجدت هذه المشكلة أيضًا.
__إصدار الرمز__: v6.10.0

__MongoDB__ بيئة: (ركضت على أحدث إصدار من حاوية Mongo docker)

2017-06-20T08:04:24.509+0000 I CONTROL  [initandlisten] db version v3.4.5
2017-06-20T08:04:24.509+0000 I CONTROL  [initandlisten] git version: 520b8f3092c48d934f0cd78ab5f40fe594f96863
2017-06-20T08:04:24.509+0000 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.1t  3 May 2016
2017-06-20T08:04:24.509+0000 I CONTROL  [initandlisten] allocator: tcmalloc
2017-06-20T08:04:24.509+0000 I CONTROL  [initandlisten] modules: none
2017-06-20T08:04:24.509+0000 I CONTROL  [initandlisten] build environment:
2017-06-20T08:04:24.509+0000 I CONTROL  [initandlisten]     distmod: debian81
2017-06-20T08:04:24.509+0000 I CONTROL  [initandlisten]     distarch: x86_64
2017-06-20T08:04:24.509+0000 I CONTROL  [initandlisten]     target_arch: x86_64
2017-06-20T08:04:24.509+0000 I CONTROL  [initandlisten] options: { security: { authorization: "enabled" } }

تكوين الاتصال الخاص بي:

var dbURL = `mongodb://${dbHost}:${dbPort}/${dbName}?authSource=admin`;
var dbAuth = { 
    useMongoClient: false
    user: dbUser,
    pass: dbPass
}
mongoose.connect(dbURL, dbAuth);

عندما أستخدم useMongoClient ليكون خطأ. عرض النمس التحذيرات التالية:

(node:7868) DeprecationWarning: `open()` is deprecated in mongoose >= 4.11.0, use `openUri()` instead, or set the `useMongoClient` option if using `connect()` or `createConnection()`
Express server listening on port 3222 in development mode
Db.prototype.authenticate method will no longer be available in the next major release 3.x as MongoDB 3.6 will only allow auth against users in the admin db and will no longer allow multiple credentials on a socket. Please authenticate u
sing MongoClient.connect with auth credentials.

لكنها تعمل بشكل جيد.

ومع ذلك ، عندما قمت بتعيينه على true ، وجدت هذا الخطأ:

Unhandled rejection MongoError: not authorized on users to execute command { listIndexes: "sessions", cursor: {} }
    at Function.MongoError.create (<my project path>\node_modules\mongoose\node_modules\mongodb-core\lib\error.js:31:11)
    at queryCallback (<my project path>\node_modules\mongoose\node_modules\mongodb-core\lib\cursor.js:212:36)
    at <my project path>\node_modules\mongoose\node_modules\mongodb-core\lib\connection\pool.js:469:18
    at _combinedTickCallback (internal/process/next_tick.js:67:7)
    at process._tickCallback (internal/process/next_tick.js:98:9)

أحاول أيضًا إزالة authSource=admin من عنوان URL الخاص بالاتصال ، لكنه لا يزال لا يعمل

(العقدة: 451) الإيقاف تحذير: open() تم إهماله في النمس> = 4.11.0 ، استخدم
openUri() بدلاً من ذلك ، أو عيِّن الخيار useMongoClient في حالة استخدام connect() أو createConnection()
لن تكون طريقة Db.prototype.authenticate متاحة بعد الآن في المجال الرئيسي التالي
التأجير 3.x حيث أن MongoDB 3.6 سيسمح فقط بالمصادقة ضد المستخدمين في admin db و w
مريض لم تعد تسمح بأوراق اعتماد متعددة على المقبس. يرجى المصادقة باستخدام M
ongoClient.connect مع بيانات اعتماد المصادقة.

حصلت على هذه المشكلة مع إصدار mongoose 4.11.0 و MongoDB الإصدار 3.4.5

+1

+1

يستخدم

mongoose.createConnection(URI)

nandofalcao عند استخدام:

  • mongoose.createConnection (URI) ؛
  • mongoose.connect (URI، {useMongoClient: true}) ؛

يبدو أنني لا أستطيع حفظ السجلات الجديدة.

let userSchema = mongoose.Schema({ name: String });
let User = mongoose.model('User', userSchema);
let joao = new User({ name: 'NewJoao ' });
joao.save((err) => err ? throw err : console.log('User created!'));//nothing happens

إضافة متعدد اللغات الليلة و +1 تجربة هذا.

// Load Mongoose
const mongoose = require('mongoose');
// import mongoose from 'mongoose' didn't give access to .connect()

// Use native Promises
mongoose.Promise = global.Promise;

// Connect database
export const Mongoose = new Promise((resolve, reject) => {
  const uri = `mongodb://${Singleton.currentConfig.databases.mongodb.host}/${Singleton.currentConfig.databases.mongodb.database}`;

  const options = {
    user: Singleton.currentConfig.databases.mongodb.user,
    pass: Singleton.currentConfig.databases.mongodb.password,
    server: {
      reconnectTries: Singleton.currentConfig.databases.mongodb.reconnectTries,
      reconnectInterval: Singleton.currentConfig.databases.mongodb.reconnectInterval,
      socketOptions: {
        keepAlive: Singleton.currentConfig.databases.mongodb.keepAlive,
        connectTimeoutMS: Singleton.currentConfig.databases.mongodb.connectTimeoutMS
      },
    },
  };

  // Initiate document store
  mongoose.connect(uri, options)

  // Check for anomalies
  .then((connected) => {
    if (mongoose.connection.readyState !== 1) {
      reject(connected);
    }
    resolve(connected);
  })

  // Complete meltdown
  .catch((error) => {
    console.log(`MongoDB Connection Error: ${error}`);
    process.exit(0);
  });
});

+1

وأحصل على الرسالة الثانية:

[2017-06-27 16: 14: 23.702] [INFO] :: - بدأ الخادم في المنفذ 2000

(العقدة: 1193) تحذير الإيقاف: open() تم إهماله في النمس> = 4.11.0 ، استخدم openUri() بدلاً من ذلك ، أو اضبط الخيار useMongoClient إذا كنت تستخدم connect() أو createConnection()

لن تكون طريقة Db.prototype.authenticate متاحة بعد الآن في الإصدار الرئيسي التالي 3.x حيث أن MongoDB 3.6 سيسمح فقط بالمصادقة ضد المستخدمين في admin db ولن يسمح بعد الآن ببيانات اعتماد متعددة على المقبس. يرجى المصادقة باستخدام MongoClient.connect مع بيانات اعتماد المصادقة.

+1

+1

+1

+1

+1

هل يمكن لشخص ما قفل هذا لمنع +1 غير المجدية؟

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

لقد غيرت الإصدار إلى 4.10.8 وهو يعمل بشكل جيد الآن.

يبدو أن ValYouW لديها إصلاح محتمل لمشكلة تحميل المستند هنا: # 5404

mongoose.connection.openUri ('mongodb: //127.0.0.1/camp_v12')

هل هناك اي احد جرب هذة؟ اختفى تحذيري الموقوف عند استخدام هذا ، فقد كان من الوثائق

http://mongoosejs.com/docs/connections.html

crisamdegracia الذي يفترض أن لديك اتصال بالفعل

// Or, if you already have a connection
connection.openUri('mongodb://localhost/myapp', { /* options */ });

وهو ما لا نفعله (على الأقل أنا منذ أن اعتدت الاتصال بـ mongodb باستخدام طريقة mongoose.connect)

mongoose.connect(config.get('mongo'), {
  useMongoClient: true,
});

لم أتمكن من العثور على أي مستند ... ما الخطأ؟

+1

لذلك بعد النظر إلى المشكلة المرتبطة من @ stageed90 والتي توضح أنه يمكنك الاتصال على النحو التالي:

const mongoose = require('mongoose');

mongoose.Promise = global.Promise;
mongoose.connect('mongodb://localhost/test', {useMongoClient: true})
    .then(() => {
        let Cat = mongoose.model('Cat', {name: String});
        let kitty = new Cat({name: 'Zildjian'});

        kitty.save(err => {
            if (err) {
                console.log(err);
            } else {
                console.log('meow');
            }
        });
    })
    .catch(err => console.error(err));

قمت بالغطس السريع خلال الكود ويبدو أن 4.11 تُرجع MongooseThenable باستثناء وقت توفير الخيار {useMongoClient: true} . في هذه الحالة تستدعي Connection.prototype.openUri والتي تُرجع نسخة جديدة من Promise.ES6 . هل يجب أن يتم تغليف هذه المكالمة Connection.prototype.openUri في MongooseThenable ؟

اعتذاري عن هذا السؤال ، هذه هي المرة الأولى التي أنظر فيها إلى قاعدة البيانات هذه ، لذا فأنا غير متأكد بعض الشيء. ولكن سأكون سعيدًا لمحاولة المساعدة في تقديم حل إذا كان بإمكاني الحصول على بعض التوضيحات حول ما إذا كان يجب دائمًا إرجاع Moongoose.prototype.connect مثيل MongooseThenable .

اعلم أن استخدام {useMongoClient: true} سيؤدي إلى استدعاء Connection.prototype.openUri ، وهو ما لا يؤدي إلى تشغيل الأوامر المخزنة التي تم إنشاؤها __قبل__ الاتصال بقاعدة بيانات بسبب # 5404

+1

آسف ، لقد كانت الأمور مجنونة ، سوف نلقي نظرة على ذلك قليلاً.

varunjayaraman لا داعي لأن تكون آسف يا صديقي. يمكن للناس إما الانتظار ، أو محاولة إصلاحها بأنفسهم.

+1

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

في ملاحظة منفصلة ، يبدو أن هذا كان تغييرًا متقطعًا إلى الوراء ، ونأمل أن يتم إصلاح هذا في الإصدار الثانوي التالي (أو ربما لم يكن كذلك ، فأنا أعمل على القليل من النوم هنا):

سيعمل هذا عادةً (باستثناء الجزء useMongoClient ، وهو جزء جديد):

const mongoose = require('mongoose');
const co = require('co');
mongoose.Promise = global.Promise;
const GITHUB_ISSUE = `gh-5399`


exec()
  .then(() => {
    console.log('successfully ran program');
    process.exit(0);
  })
  .catch(error => {
    console.error(`Error: ${ error }\n${ error.stack }`);
  });


function exec() {
  return co(function*() {
    const db = mongoose.createConnection(`mongodb://localhost:27017/${ GITHUB_ISSUE }`, { useMongoClient: true })
    const schema = new mongoose.Schema({
      name: String
    });


    const Model = db.model('Model', schema);
  });
}

يبدو أن هذا يتسبب في حدوث خطأ بالنسبة لي لأن db.model لم يعد دالة.

عند استخدام mongoose.model ، فإنه يعمل:

const mongoose = require('mongoose');
const co = require('co');
mongoose.Promise = global.Promise;
const GITHUB_ISSUE = `gh-5399`


exec()
  .then(() => {
    console.log('successfully ran program');
    process.exit(0);
  })
  .catch(error => {
    console.error(`Error: ${error}\n${error.stack}`);
  });


function exec() {
  return co(function* () {
    const db = mongoose.connect(`mongodb://localhost:27017/${GITHUB_ISSUE}`, { useMongoClient: true })

    return db
      .then(() => {
        const schema = new mongoose.Schema({
          name: String
        });


        const Model = mongoose.model('Model', schema);

        return Model.create({ name: 'test' });
      })
      .then(doc => console.log(doc));

  });
}

varunjayaraman لقد قمت للتو بتحديث Mongoose واستخدم useMongoClient: true كما تقترح ، لكن لدي مشكلة.
لا يدعم ، وفقًا لوثائق النمس الرسمية ، خيارات user و pass :

the options [user] is not supported
the options [pass] is not supported

ونعم ، فشل في ذلك. : -1:

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

itpcc حاول استخدام إصدار 4.10.8 هو الحل الأفضل في هذا الوقت.

npm remove mongoose
npm install [email protected] --save

الائتمان: @ Chenz62

CQBinh شكرا لك على نصيحتك. لقد قرأت بالفعل تلك التعليقات حول هذا الموضوع.
ومع ذلك ، لا أعتقد أن استخدام الإصدار الأقدم هو الحل الأفضل في الوقت الحالي. ويمكن حلها عن طريق إدراجها في سلسلة الاتصال.
أشعر بالارتباك فقط لأنه مذكور في المستند ولكنه لا يعمل. : /
راجع للشغل ، أبلغ عن مشكلة جديدة هنا

varunjayaraman إذا لم يعد db.model موجودًا ، فكيف يمكن التعامل مع اتصال نمس متعدد مع طرز مختلفة؟

على سبيل المثال ، النموذج 1 والنموذج 2 المرتبطان بوصلة النمس 1 والنموذج 3 والنموذج 4 متصلان بوصلة النمس 2.

في السابق كان يتم ذلك عن طريق استدعاء mongoose.createConnection لكل من التوصيلات ، وإرفاق النماذج بكل من قيم الإرجاع هذه.

تحرير: أم أنها لا تزال تعمل في هذه الحالة:

const conn = mongoose.createConnection(...);
const Model = conn.model('ModelName', schema);

+1

@ boyce-ywr بجدية ، +1 آخر ؟؟؟ ما الخطأ في الناس لك؟؟
انشر تعليقات بناءة ، وليس أشياء من هذا القبيل.

فيما يتعلق بالنمس ، ليس من الواضح بالنسبة لي ما إذا كان سيتم استبدال طريقة mongoose.connect() في الإصدارات المستقبلية أم لا. شخص ما يمكن أن يشرح من فضلك؟

simonemazzoni أنت على حق ، إنهم يرسلون لنا الرسائل الاقتحامية.

إذا كنت تريد أن يتم تضمينك في إشعارات هذا الموضوع ، فكل ما عليك فعله هو الاشتراك فيه (يوجد زر في الجزء العلوي من سلسلة الرسائل) ،

كل ما تفعله عند إجراء 1+ هو إرسال رسالة بريد إلكتروني إلى الجميع هنا

مرحبا انا هنا!

نحن لا نهتم ، نحن ننتظر التعليقات البناءة والحل .

أيضًا لماذا لا تحذف جميعًا من إجراءات +1 منشوراتك من هذه القائمة ، فهي مؤلمة للعين وألم في الخلف لتضطر إلى التمرير إلى الماضي فقط للوصول إلى التعليقات الحقيقية.

كما قال البعض من قبل ، "الحل" الوحيد هو العودة إلى [email protected]_ ...
على الأقل لغاية الآن!

يبدو وكأنه خطأ ، عاد إلى [email protected] لحل المشكلة

استخدم mongoose.createConnection (...) بدلاً من mongoose.connect (...)

إليك مثال عملي كامل لاستخدام [email protected] بناءً على توصيةdiegoazh

const mongoose = require('mongoose')
mongoose.Promise = require('bluebird')  // optional, use this to get rid of 
                                        // the mpromise DeprecationWarning
const conn = mongoose.createConnection('mongodb://localhost/testDB')
const Schema = mongoose.Schema

const UserSchema = new Schema({
    username: String,
    email: String
})

const User = conn.model('User', UserSchema)
module.exports = User

midnightcodr إذن نحن فقط نسقط الاتصال ونستخدم createConnection بدلاً من ذلك؟

@ bertolo1988 تمامًا كما اقترح ppl حول هذه المشكلة ، يوجد حاليًا حلان

  1. العودة إلى 4.10.8
  2. استخدم النمط الجديد إذا كنت ترغب في التمسك بالإصدار الجديد
const conn = mongoose.createConnection(...)
const Model = conn.model(...)

أنا شخصيا أفضل الحل الثاني.

شكرا!!!
تم حلها عن طريق createConnection ، واستخدم هذا الاتصال لعمل نموذج (بدلاً من النمس)

let mongoose = require('mongoose');

mongoose.Promise = global.Promise;

module.exports = mongoose;
const mongoose = require('./set-mongoose');
module.exports = mongoose.createConnection('mongodb://localhost/advisorDemoTestDB');

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

كان من الرائع أن يلتف نموذج الاتصال القديم بنموذج الاتصال الجديد.

هناك الكثير من المنشورات ، لذا يمكنني أن أحاول تلخيصها:

  1. التحذير تحذير مهمل ، مما يعني أنه لا داعي للاندفاع. إذا لم نغير أي شيء ، فسيظل يعمل كما كان دائمًا ، يبدو أن كل شيء على ما يرام

  2. وفقًا للتحذير ، سيتم تعديل connect () / تم تعديله وسيكون تمرير useMongoClient أمرًا ضروريًا. ولكن هنا هو الخطأ / المشكلة المحتملة

  • connect ('myurl'، {useMongoClient: true}) => توقف تحميل المستند ولا يمكن الكتابة في db

  • connect ('myurl'، {useMongoClient: false}) => يبدو أنه يعمل بشكل جيد ولكن التحذير لا يزال معروضًا

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

يوافق على؟

ومع ذلك ، في حين أن تحذير الإيقاف هو تحذير "عادل" بالفعل ، فإن ظهور ذلك يجعلني أتساءل متى ستتم إزالته بالفعل. إذا كان النمس يتبع semver ، فيجب أن يظل موجودًا في الفرع 4.x. لذلك ، يجب أن يستمر العمل مع التوافق مع الإصدارات السابقة حتى يتم إصدار 5.x.

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

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

لا أعرف إلى أين يتجه هذا ، لكنني قضيت الجزء الأكبر من نهاية هذا الأسبوع في محاولة الحصول على اتصال بالذهاب إلى أطلس MongoDB. كان السائق الأصلي mongodb يعمل على الفور ويقوم بتشغيل أشياء CRUD.

ومع ذلك ، فإن محاولة الحصول على النمس هو كابوس كامل. إذا استخدمت createConnection مع 4.11 ، فستتوقف اتصالات المجموعة:

MongoError: connection 4 to cluster0-myshard.mongodb.net:27017 closed

بدلا من ذلك ، يمكنني ضبط

useMongoClient: true

ولكن بعد ذلك أحصل على معرف على طراز connect.model

<info> atlas-api-test.js:65 (Test.testVendors) conn.model undefined

Archomeda لا توجد خطط لإزالة سلوك الاتصال القديم في 4.x ، ويتم حظر 5.x عند نقل منطق الاتصال الجديد إلى حالة مستقرة. هناك مستندات في مستندات الاتصال سيحسّنها 4.11.1 ويجب أن يكون الارتباط بها مفيدًا. رد: المكالمة model() ، إذا حددت useMongoClient: true ، فلن يُرجع createConnection() اتصالًا ، بل وعدًا يحل الاتصال الذي تحتاجه إلى .then() في. تم وصف الأساس المنطقي هنا: https://github.com/Automattic/mongoose/issues/5404#issuecomment -312522539 لا تتردد في التعبير عن أي مخاوف بشأن هذا بشأن المشكلة رقم 5404.

يبدو أن mkastner تستخدم createConnection() . باستخدام useMongoClient: true ، يُرجع createConnection() وعدًا يحل الاتصال. الرجاء استخدام await mongoose.createConnection() أو mongoose.createConnection().then()

أشار peterpeterparker # 5404 إلى مشكلة في منطق الاتصال الجديد الذي سيتم إصلاحه في 4.11.1 ، ليتم إصداره في غضون الـ 24 ساعة القادمة.

@ cosminn777 ما هي القضايا المعمارية التي تواجهها؟ يرجى فتح قضية منفصلة لمناقشتها. تتمثل الخطة طويلة المدى في أنه في 5.x لن ندعم Node <4 ، لذلك سيكون لدى كل شخص يستخدم النمس وصول أصلي إلى المولدات و / أو غير متزامن / انتظار ، لذلك سيكون هذا التغيير سهلاً مثل إضافة yield كشف حساب await .

alanpurple ، المشكلة التي تشير إليها هي نفس المشكلة المذكورة # 5404 وسيتم إصلاحها بـ 4.11.1.

itpcc لقد فتحت إصدارًا منفصلاً لتتبع # 5432. في الوقت الحالي ، يرجى وضع اسم المستخدم / كلمة المرور في URI: var dbURL = mongodb: // $ {dbUser}: $ {dbPass} @ $ {dbHost}: $ {dbPort} / $ {dbName}؟ authSource = admin`.

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

طالما أنك تستخدم 4.x ، فسيعمل منطق الاتصال الحالي ، فسيتم فقط طباعة تحذير. في غضون ذلك ، لا تتردد في الإبلاغ عن أي مشكلات لديك في مشكلة منفصلة عن github.

اعتمدت للتو الطريقة الجديدة وهي تعمل بشكل رائع. شكرا لكم جميعا!

@ vkarpov15 شكرا على التوضيحات.

باعتباره FYI ، يتم طرح نفس تحذير الإيقاف مع openSet أيضًا (أنا أستخدم مجموعة نسخ متماثلة).

للتلخيص ، من الآمن تجاهل هذا التحذير في الوقت الحالي لأنه يتعلق فقط بالأعمال الداخلية لـ Mongoose ، ويمكننا محاولة استخدام useMongoClient ولكن لا يتعين علينا ذلك حتى الآن.

ما مدى استقرارها في اعتقادك؟ هل هو آمن للاستخدام؟ لا أرغب في قضاء ساعتين في إعادة هيكلة جميع نماذجنا ومنطق الاتصال لمعرفة أنه لا يزال غير قابل للاستخدام في الإنتاج.

هل من الممكن إزالة تحذير الإيقاف حتى يحين الوقت الذي يكون فيه استخدام العلامة مستقرًا والطريقة الموصى بها للاتصال من الآن فصاعدًا؟ أم هل تم الوصول إلى هذه النقطة بالفعل؟

هههههههههههههه

لكني أستخدم غير متزامن في createConnection. لقد قمت بإعداد اختبارين على خادم db. الأول هو اختبار mongo-js canary الأصلي للتأكد من أن عنوان url يعمل ويمكنني كتابة وقراءة:

tape('test connection via mongo native', async function testMongoConnection(t) {

  try {

    t.plan(1);
    let db = await MongoClient.connect(dbURL);
    await db.collection('users').insert({name: 'username'});
    let result = await db.collection('users').find({});
    let docs = await result.toArray();
    log.info('result', await result.toArray());
    t.equal(1, docs.length);
    db.collection('users').remove({});

    await db.close();

  } catch (err) {
  console.error(err)
  }
});

نتيجة:

2017-07-04T09:00:34+0200 <info> atlas-api-test.js:28 (Test.testMongoConnection) result [ { _id: 595b3d1146734207bad88f9d, name: 'username' } ]
✔ should be equal

نجحت باختبار النمس باستخدام النمس createConnection مع الانتظار:

tape('test connection via mongoose', async function testMongooseConnection(t) {

  try {
      let conn = await mongoose.createConnection(dbURL, {
        useMongoClient: true,
        /*
        // tried these settings too
        user: 'myUserName',
        pass: 'myPassword',
        connectTimeoutMS: 30000,
        rs_name: 'myReplSetName',
        ssl: true,
        auto_reconnect: true,
        */
      });

      let UserSchema = new mongoose.Schema({
        name: String,
      });

      let User = mongoose.model('User', UserSchema);
      let newUser = new User({name: 'username'});
      let createdUser = await newUser.save();

      // just ending test without validating any results
      t.end();

  } catch (err) {
    log.error(err);
  }

});

ويحدث الخطأ التالي:

/mypath/node_modules/mongodb/lib/replset.js:390 process.nextTick(function() { throw err; })
                                    ^
MongoError: connection 8 to cluster0-shard-00-02-c4nst.domain.com:27017 closed at Function.MongoError.create (/mypath/node_modules/mongodb-core/lib/error.js:29:11)
at Socket.<anonymous> (/mypath/node_modules/mongodb-core/lib/connection/connection.js:202:22)
at Object.onceWrapper (events.js:316:30)
at emitOne (events.js:115:13)
at Socket.emit (events.js:210:7)
at TCP._handle.close [as _onclose] (net.js:549:12)`

قد أكون مخطئًا للغاية هنا ، لكن بالنسبة لي لا يبدو الأمر وكأنه مشكلة غير متزامنة / وعد ؛

أنا أستخدم مونجو أطلس. عندما أستخدم {useMongoClient: true} ، سيتصل تطبيقي بقاعدة البيانات بنجاح ولكن قاعدة البيانات لا تستجيب للتطبيق ، أليس كذلك؟

رمز بلدي:
mongoose.connect(config.dbhost, {useMongoClient: true}, function(err){ if(err){ console.log(err); } else { console.log('connected to the database successfuly.'); } });

مجرد إشعار للجميع لأنني لم أره مذكورًا هنا: تم إصدار 4.11.1 وبعد نظرة سريعة يبدو أن مشكلة التخزين المؤقت عند استخدام useMongoClient = true قد تم إصلاحها. سأختبر المزيد غدًا. اي شخص اخر؟

ما هو الحل النهائي؟

نجح هذا بالنسبة لي (الإصدار 4.11.1):

قاعدة البيانات. js

mongoose.connect(databaseUri, { useMongoClient: true })
      .then(() => console.log(`Database connected at ${databaseUri}`))
      .catch(err => console.log(`Database connection error: ${err.message}`));

user.model.js

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const userSchema = new Schema({ ... });
const User = mongoose.connection.model('User', userSchema);

تحديث

قد لا يكون الرجوع إلى الاتصال ضروريًا عند تهيئة النموذج الخاص بك (شكرًا ، kyrylkovpeterpeterparker ):

user.model.js

const User = mongoose.model('User', userSchema);

هل يمكن لشخص ما أن يشرح بإيجاز ما المقصود بالضبط بـ {useMongoClient: true} أم ماذا تفعل هذه العلامة؟

أنا ضائع قليلاً ، ما فائدة استخدامه؟

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

@ Blackbaud-SteveBrush لا يعمل. أنا أستخدم مونجو أطلس. لماذا لا يعمل؟

تضمين التغريدة

لا تعمل كيف؟ إنه يعمل بالنسبة لنا على mLab و MongoDB Atlas مع المعتاد:

const User = mongoose.model('User', userSchema);

بدلا من:

const User = mongoose.connection.model('User', userSchema);

إذا حاولت تمكين خيار useMongoClient مع عدد قليل من المضيفين المحددين في URI ، فإنه يتوقف ثم يُلقي بالخطأ:
MongoError: no mongos proxy available at Timeout._onTimeout (/home/ubuntu/code/pss/node_modules/mongoose/node_modules/mongodb-core/lib/topologies/mongos.js:636:28) at ontimeout (timers.js:386:14) at tryOnTimeout (timers.js:250:5) at Timer.listOnTimeout (timers.js:214:5) name: 'MongoError', message: 'no mongos proxy available'
uri: mongodb: //10.0.1.49 ، 10.0.2.158،10.0.3.84 / pss
الخيارات: {useMongoClient: true ، autoReconnect: true ، keepAlive: 300000 ، connectTimeoutMS: 30000}

لأي شخص مهتم ، إليك مستندات Mongoose على المعلمة useMongoClient : http://mongoosejs.com/docs/connections.html#use -mongo-client

"تم إهمال منطق الاتصال الافتراضي الخاص بـ Mongoose اعتبارًا من 4.11.0 ... يرجع هذا الإهمال إلى قيام برنامج تشغيل MongoDB بإهمال واجهة برمجة تطبيقات تعتبر بالغة الأهمية لمنطق اتصال mongoose لدعم MongoDB 3.6 ، راجع مشكلة github هذه للحصول على مزيد من التفاصيل." إليك مشكلة GitHub: https://github.com/Automattic/mongoose/issues/5304

@ تشك Blackbaud-SteveBrush للإشارة إلى أن لدينا. لذلك إذا فهمت بشكل صحيح

useMongoClient = true => تنشيط منطق الاتصال الجديد الذي سيعمل أيضًا مع Mongo 3.6
useMongoClient = خطأ => القيمة الافتراضية. منطق الاتصال القديم <4.11.0. الذي تم إهماله.

حق؟

@ Blackbaud-SteveBrush حول قطعة الكود الخاصة بك ، في حالتي أنا لا أستخدمها

const User = mongoose.connection.model('User', userSchema);

لكن

const User = mongoose.model('User', userSchema);

وكان لا يزال ناجحًا. شكرا

النمس يعمل بالنسبة لي 4.10.8: |

لقد وجدت أن هذا من المحتمل أن يكون خطأ في النمس

اختفت المشكلة بعد التراجع عن نسخة النمس

npm إلغاء التثبيت-حفظ النمس
npm تثبيت - حفظ [email protected]

لقد تجاهلت تمامًا هذا التحذير وكل شيء يعمل كما هو متوقع. ربما هذا هو الحل الآن. فقط تجاهل.

التراجع إلى 4.10.8 جعل الاتصال يعمل مرة أخرى ولكن ما زلت أتلقى الخطأ

Db.prototype.authenticate method will no longe against users in the admin db and will no long connect with auth credentials.

@ peterpeterparker صحيح. لن يعمل رمز المصادقة الحالي الخاص بـ Mongoose على mongodb 3.6 بناءً على فهمي ، لذا فإن useMongoClient يمثل لنا محاولة تجاوز هذه المشكلة مع الحفاظ على التوافق مع الإصدارات السابقة. على حد علمي ، لا يوجد تاريخ مجدول للإصدار لـ mongodb 3.6 حتى الآن ، لذا فإن التبديل لا يضغط.

adamreisnz لدينا عدد قليل من الأخطاء ولكن في الحقيقة منطق الاتصال الجديد عبارة عن غلاف رقيق للغاية حول استخدام وظيفة MongoClient.connect () لبرنامج التشغيل الأصلي ، والتي كانت الطريقة المفضلة للاتصال بـ mongodb لبضع سنوات حتى الآن. بمجرد أن يتم إنشاء اتصالك ، فإن منطق برنامج التشغيل mongodb نفسه يحافظ على الاتصال. يجب أن يؤثر useMongoClient على الاتصال الأولي فقط.

@ vkarpov15 thx كثيرًا للتوضيح وبالطبع للعمل ، أقدر ذلك حقًا!

@ vkarpov15 شكرًا ، سأجربها وأنتقل إلى استخدام useMongoClient وانظر إلى أين سيأخذنا.

const النمس = تتطلب ("النمس") ؛
const db = " mongodb: // localhost / testaroo " ؛

النمس.التوصيل.فتح يوري (ديسيبل) ؛
mongoose.connection.once ("open"، function () {
console.log ("اتصال مؤسس") ؛
}). on ("error"، function (error) {
console.log (خطأ) ؛
})

- أنا استخدم هذا ولم يتم العثور على أخطاء

var mongoose = require('mongoose');
mongoose.Promise = global.Promise;

var mongoDB = mongoose.connect('mongodb://your_database', {
    useMongoClient: true
});

mongoDB
    .then(function (db) {
        console.log('mongodb has been connected');
    })
    .catch(function (err) {
        console.log('error while trying to connect with mongodb');
    });

module.exports = mongoDB;

أنا أستخدم هذا ولم يتم العثور على أخطاء

vitorbarros لقد عملت بالنسبة لي. شكرا!

إنه يعمل بالنسبة لي:
http://mongoosejs.com/docs/connections.html#use-mongo-client

أجريت هذا الاختبار السريع ونجح:

// index.js
const mongoose = require('mongoose')
mongoose.Promise = global.Promise;
const db = mongoose.createConnection(`mongodb://localhost/test`)

db.on('error', err => console.log(err))
db.once('open', () => {
  console.log(`Connected to Mongo at: ${new Date()}`)
  db.close(() => {
    console.log(`Disconnected from Mongo at: ${new Date()}`)
  })
})

ثم يعطيني node index.js :

Connected to Mongo at: Thu Jul 13 2017 22:54:50 GMT+0000 (UTC)
Disconnected from Mongo at: Thu Jul 13 2017 22:54:50 GMT+0000 (UTC)

شكرا لكم جميعا!

vitorbarros الحل الخاص بك يعمل! شكرا.

أستطيع أن أؤكد أنه مع 4.11.3 استبدال منطق الاتصال بما اقترحه vitorbarros يزيل التحذيرات ويبدو أنه يعمل بشكل جيد 👍

ليست هناك حاجة لإعادة بناء مراجع النموذج كما هو مقترح سابقًا هنا في هذا الموضوع.

حل vitorbarros هو بالفعل الطريقة الموصى بها وفقًا لوثائق "الخيار useMongoClient " .

ومع ذلك ، لاحظ أن mongoose.Promise = global.Promise; سوف _not_ يعد ببرنامج تشغيل Mongo الأساسي . وفقًا لوثائق "Promises for the MongoDB Driver" ، يجب أيضًا تعيين الخاصية promiseLibrary في كائن الخيارات للطريقة connect .

علي سبيل المثال:

var mongoDB = mongoose.connect('mongodb://your_database', {
    useMongoClient: true,
    promiseLibrary: global.Promise
});

سيستخدم global.Promise محرك الوعد الأصلي. بطبيعة الحال ، من الممكن أيضًا استخدام Bluebird أو أي محرك آخر ، على سبيل المثال promiseLibrary: require('bluebird')

vitorbarros حل يعمل بالنسبة لي. ونحتاج أيضًا إلى استخدام مكتبة الوعد مثل @ boaz-amit قال.
ولكن ما هي الطريقة الأفضل لاستخدام بيانات المصادقة؟
في URL

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

أو أفضل تعيين المستخدم وكلمة المرور في الخيارات؟ لا أجد المكان المناسب الآن.

هذه ليست سوى طريقة واحدة للمصادقة؟

وهذا هو الحل الخاص بي. يعمل هذا أيضًا حتى في حالة فشل الاتصال الأول.

let firstConnectTimeout = null;
const mongoConnect = () => {
    const mongoDB = mongoose.connect('mongodb://localhost/test', {
        useMongoClient: true
    });

    mongoDB
        .then((db) => {
            clearTimeout(firstConnectTimeout);
        })
        .catch((err) => {
            firstConnectTimeout = setTimeout(mongoConnect, 5000);
        });
};

mongoConnect();

يجب أن يكون في عنوان url ، لم تعد خيارات المستخدم / المرور تعمل مع
useMongoClient صحيح لقد وجدت.

يوم الاثنين ، 17 يوليو 2017 ، الساعة 20:28 Andrey Prisniak [email protected]
كتب:

vitorbarros https://github.com/vitorbarros حل يعمل بالنسبة لي. و
نحتاج أيضًا إلى استخدام مكتبة الوعد مثل @ boaz-amit
https://github.com/boaz-amit قال.
ولكن ما هي الطريقة الأفضل لاستخدام بيانات المصادقة؟ في URL
mongodb: // [ اسم المستخدم: كلمة المرور @
] host1 [: port1] [، host2 [: port2]، ... [، hostN [: portN]]] [/ [database] [؟ options]]
أو أفضل تعيين المستخدم وكلمة المرور في الخيارات؟ لا أجد المكان المناسب
حاليا.

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/Automattic/mongoose/issues/5399#issuecomment-315694642 ،
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/AAd8Qup1YY4lhUhQccv2kLKtraARxvP0ks5sOxs_gaJpZM4OEnIt
.

adamreisnzaprisniak يعمل على ذلك ، راجع # 5419. في غضون ذلك ، يرجى وضع اسم المستخدم وكلمة المرور في URI الخاص بك: mongodb://user:pass<strong i="7">@hostname</strong>:port/db

لقد كتبت أيضًا منشور مدونة حول هذا الخيار وسبب ضرورته: http://thecodebarbarian.com/mongoose-4.11-use-mongo-client.html

@ vkarpov15 أنا أستخدم المستخدم: قم بتمرير URI ، ولكن لا يزال لديك التحذير.

بالنسبة لأولئك الذين يستخدمون النمس مع Gridfs-Stream:

const mongooseConnect = mongoose.connect(
    process.env.MONGODB_URI || process.env.MONGOLAB_URI,
    {
        useMongoClient: true
    }
)

let gfs
mongooseConnect.then(conn => {
    gfs = Grid(conn.db)
    /** Setting up GFS storage here */
})

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

لست متأكدًا من أن أفعل شيئًا مع هذا التحذير أم لا؟ سيتم إصلاحه ، أليس كذلك؟

أنا فقط أضفت useMongoClient في الكتابة لجعلها تعمل. تضمين التغريدة

FinalDes كيف؟ أضفت mongoose.connect(process.env.DATABASE, { useMongoClient: true }) ولكن ما زلت أتلقى الرسالة. وأنا أستخدم user: pass in URI

أفضل طريقة للتخلص من هذه المشكلة هي استخدام هذين الأمرين:
npm إلغاء التثبيت-حفظ النمس
npm تثبيت - حفظ [email protected]

ملاحظة: [email protected] هو الإصدار الثابت.

كيف ستتعاملون جميعًا مع إنشاء المخطط والنموذج وكذلك الوصول إليهما؟

لقد جربت كل إصلاح في الموضوع. مع التحذير ، كل شيء يعمل بشكل جيد. بمجرد أن أحاول useMongoClient: true أو mongoose.createConnection ، يتخلص من التحذير ويمكنني الاتصال بـ db ، ولكن أي كود يحاول الوصول إلى النموذج يفشل. لا توجد أخطاء ، لا يعمل الكود أبدًا.

تضمين التغريدة
فقط في عداد المفقودين في الكتابة ، لذلك عند التشغيل مع "noImplicitAny": صحيح ، لن يكون هناك خطأ

استيراد النمس = يتطلب ("النمس") ؛
استيراد dotenv = يتطلب ("dotenv") ؛
dotenv.config () ،
mongoose.Promise = global.Promise ؛
const MONGO_URI = `mongodb: // $ {process.env.MONGODB_HOST}: $ {process.env.MONGODB_PORT} / $ {process.env.MONGODB_DB}` ؛
mongoose.connect (MONGO_URI ، {
useMongoClient: صحيح ،
}) ؛

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

لقد واجهت نفس المشكلة مع @ Snow-Okami

  1. const mongoDB = mongoose.connect(config.database, { useMongoClient: true });
    هذا يتخلص من التحذير ويتصل ديسيبل. ومع ذلك ، فإن أي شيء يحاول الوصول إلى النموذج يفشل (الحصول / النشر). لا يعود أي خطأ.
  2. const mongoDB = mongoose.connect(config.database, function(){ useMongoClient: true });
    وهذا يعطي هذين التحذيرين ، لكن كل شيء بخلاف ذلك يعمل بشكل جيد.

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

Nikunjksanghavi إنه مجرد تحذير ، لا ينبغي أن يفشل شيء.

iamdubx أي نوع من الخطأ؟

FinalDes خطأ في الإهمال ، ما الذي نتحدث عنه أيضًا في هذا الموضوع؟

نجح هذا بالنسبة لي: (الإصدار 4.11.4)

const MONGO_URI = process.env.MONGO_URI
const mongoose = require('mongoose');

// Use your own promis library
mongoose.Promise = require('bluebird');

// connect to mongo, use Mongo Client
mongoose.connect(MONGO_URI, {useMongoClient: true})
  .then(({db: {databaseName}}) => console.log(`Connected to ${databaseName}`))
  .catch(err => console.error(err));

const poemSchema = mongoose.Schema({
    name: String,
    text: String
});

const Poem = mongoose.model('Poem', poemSchema);

const insertPoem = poem =>
  (new Poem(poem)).save( (err, newPoem) => 
    console.log(err || newPoem));

insertPoem({name: 'poemName', text: 'this is a poem'})

// اتصال DB
var mongoose = يتطلب ('mongoose') ؛
mongoose.Promise = global.Promise ؛
mongoose.connect ('mongodb: // localhost / login_register'، {
useMongoClient: صحيح
})
.then (() => console.log ('connect succesful'))
.catch ((يخطئ) => console.error (يخطئ)) ؛
// نهاية اتصال DB

هذا لا يعمل بالنسبة لي. لا يزال لدي تحذير وحدة التحكم. ولا يوجد تفسير واضح يقدم.

النمس أمر مروع. هو أيضًا أسوأ موقع للتوثيق رأيته في المكتبات التي تحظى بشعبية كبيرة. يا للعار!

الآن أفكر في التحول إلى RethinkDB. مؤسسة لينكس - هذا أمر خطير.
أيضا Postgre رهيبة.

مونغو - عار جدا جدا.

iamdubx هل جربت الحل أعلاه؟ هل يمكنك لصق التحذير على هذا؟ ربما يمكنني المساعدة :)

يمكن iamdubx نشر رسالة التحذير الخاصة بك؟

FinalDes @ shams-ali لقد نشرت من قبل ، إنه نفس خطأ الإهمال مثل الموضوع. الموضوع الذي يدور حوله هذا الموضوع!

(node:3304) DeprecationWarning: `open()` is deprecated in mongoose >= 4.11.0, use `openUri()` instead, or set the `useMongoClient` option if using `connect()` or `createConnection()`. See http://mongoosejs.com/docs/connections.html#use-mongo-client
Server listening on port: 7777
Db.prototype.authenticate method will no longer be available in the next major release 3.x as MongoDB 3.6 will only allow auth against users in the admin db and will no longer allow multiple credentials on a socket. Please authenticate using MongoClient.connect with auth credentials.

iamdubx مثير للاهتمام ، هذا هو نفس التحذير الذي تلقيته ويبدو أن الحل أعلاه الذي نشرته يصلح لي. هل يمكنك لصق الكود الذي تم تحديثه والذي لا يعمل؟

هذا ما نجح معي:

// ES6 promises
mongoose.Promise = Promise;

// mongodb connection
mongoose.connect("mongodb://localhost:27017/sandbox", {
  useMongoClient: true,
  promiseLibrary: global.Promise
});

var db = mongoose.connection;

// mongodb error
db.on('error', console.error.bind(console, 'connection error:'));

// mongodb connection open
db.once('open', () => {
  console.log(`Connected to Mongo at: ${new Date()}`)
});

afoke يعمل شكرا

FinalDes على الرحب والسعة.

هذا هو سير العمل الجديد الخاص بي ، أحاول أن أكون متوافقًا مع التحذيرات والإهمالات:

// db.js
const model = require('./model');
const mongoose = require('mongoose');
mongoose.Promise = global.Promise;


async function db(uri) {
  const con = await mongoose
    .createConnection(uri, {
      useMongoClient: true,
    });

  const {User} = model(con);

  // do something with User
  ...

  // the interface for the server
  return {
    create: params => User.create(params),
    ...
  };
}


module.exports = db;

والآن ترجع وحدة النماذج وظيفة الاتصال

// model.js
const {Schema} = require('mongoose');


const UserSchema = new Schema({
  name: String,
  age: Number,
});

// Other Schemas
...

module.exports = con => ({
  User: con.model('User', UserSchema),
  ...
});

أي مبادئ توجيهية رسمية حول هذا الموضوع؟

iamdubx يبدو أنك لا تفهم الفرق بين التحذير والخطأ .

التحذير المعني لا يكسر أي شيء ، ولكنه يحذر المستخدم من شيء ستتم إزالته في الإصدار الرئيسي التالي.

النمس أمر مروع.

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

تضمين التغريدة

التحذير المعني لا يكسر أي شيء ، لكنه يحذر المستخدم من شيء ستتم إزالته في الإصدار الرئيسي التالي.

إنه يقوم بتلويث الاختبارات ووحدة التحكم وهو أمر مزعج إلى حد ما.

النمس أمر مروع. هو أيضًا أسوأ موقع للتوثيق رأيته في المكتبات التي تحظى بشعبية كبيرة. يا للعار!

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

حقيقة أن النمس يعيد توجيه واجهة برمجة تطبيقات mongo client. الذي يعمل بطريقة مختلفة تمامًا ، مما يجعل استخدام Mongoose والتوثيق محيرًا.

سيكون الحل المحتمل لهذا هو:

  • توقف عن فعل ذلك
  • قم بإزالة الوثائق الخاصة بأساليب عميل Mongo
  • توفير وسيلة لمشاركة الاتصال بين العميل الرسمي و Mongoose

أود أيضًا أن أقترح تحسين إمكانية البحث في المستندات عن طريق تقسيمها في عدة صفحات وإعطاء مزيد من الأفكار للمستخدمين الجدد حول ما يفعله Mongoose بالفعل لتحقيق بعض النتائج.

كان لدي هذا الخطأ ، لكنه اختفى بعد أن أضفت خيار {useMongoClient: true}.
أستخدم Debian 9 ، نسخة تجريبية ، مع الإصدار MongoDb. 3.2.11 والنمس الإصدار. 4.10.4.
لدي رسالة "متصل بـ MongoDB" (اعرض الكود في كتابة نص أدناه) ، كل شيء يعمل بشكل مثالي.

(<أي> نمس]. الوعد = global.Promise ؛
mongoose.connect (process.env.MONGODB_URI، {useMongoClient: true}) ،
const ديسيبل = النمس.
db.on ('error'، console.error.bind (وحدة التحكم، 'خطأ الاتصال:'))؛
db.once ('open'، () => {
console.log ('متصل بـ MongoDB') ؛
setRoutes (التطبيق) ؛
app.get ('/ *'، function (req، res) {
res.sendFile (path.join (__ dirname، '../public/index.html')) ؛
}) ؛
app.listen (app.get ('port')، () => {
console.log ('MyApp يستمع على المنفذ' + app.get ('port')) ؛
}) ؛
}) ؛

ما عليك سوى إلغاء تثبيت إصدار النمس الحالي الذي لديك وتثبيت الإصدار الأدنى npm install [email protected] --save . لا داعي لفعل أي شيء آخر فهذا سيعمل بالتأكيد من أجلك.

mongoose.connect(database.host, { useMongoClient: true });

هذا حل مشكلتي. لكن تلقيت تحذيرًا آخر بعد إجراء هذا التغيير.

تحذير: النمس: تم إهمال mpromise (مكتبة وعد النمس الافتراضية) ، قم بتوصيل مكتبة الوعد الخاصة بك بدلاً من ذلك: http://mongoosejs.com/docs/promises.html

يحل هذا الرمز جميع تحذيرات الإهمال:
`` جافا سكريبت
mongoose.Promise = global.Promise ؛
mongoose.connect (uri ، {
keepAlive: صحيح ،
أعد الاتصال المحاولات: Number.MAX_VALUE ،
useMongoClient: صحيح
}) ؛
""
مزيد من المعلومات عن طريق الرابط -> http://mongoosejs.com/docs/connections.html#use -mongo-client

تضمين التغريدة شكرا!

bricss لقد صنعت يومي.

حصل شخص ما على شارة بطل ...

تحرير: bricss لقد أزال تحذيرات الإيقاف بالنسبة لي ، لكن لم أتمكن من استرداد البيانات من صناديق حماية mLab الخاصة بي. قد يكون ذلك بسبب استخدامهم لإصدار أقدم من MongoDB. سأحاول التحقق من ذلك لاحقًا.

تحرير: bricss إنه يعمل الآن بشكل صحيح مع أحدث إصدار من النمس 4.11.9 واتصال بـ Cosmos DB على Azure.

bricss : أحسنت صنعًا بالطوب! لقد نجحت معي على الرغم من أنني أستخدم نسخة قديمة حقًا من mongodb في بلدي المحلي: +1:

تضمين التغريدة ولكن قد تفكر في وضع رقم أصغر لـ "إعادة الاتصال". لا تريد قضاء يوم كامل في إعادة الاتصال إذا كانت هناك مشكلة في قاعدة البيانات الخاصة بك.

نجح حل afoke بالنسبة لي ، فقط عندما أعلن صراحة عن db في سلسلة الاتصال ، أي mongodb://localhost:27017/test لكن ليس mongodb://localhost:27017

هل يمكنني إنشاء اتصال بـ 2 ديسيبل دون هذا التحذير؟ أحتاج إلى استخدام نماذجي مع قواعد بيانات مختلفة.

باستخدام mongoose v ^ 4.11.6 ، عند إضافة useMongoClient ، اختفى التحذير.

const uri = "http://blablabla.blo/blaDB"; mongoose.Promise = global.Promise; mongoose.connection.on('error', (err) => { console.error( Mongoose خطأ في الاتصال: $ {err} `)؛
process.exit (1) ؛
}) ؛
mongoose.connect (uri، {useMongoClient: true}) ؛

 // load models
 require('./model1');
 // ...
 require('./modelN');`

الاتصال بقاعدة البيانات بهذه الطريقة يحل المشكلة:
mongoose.connect (url، {user: 'username'، pass: 'mypassword'، useMongoClient: true}) ؛

هل ستسبب هذه الأخطاء مشاكل ، على سبيل المثال في الأمن؟

لا مزيد من التحذير "المهمل" ينبثق إذا استخدمت بناء الجملة هذا 🎉

mongoose.connection.openUri('mongodb://localhost/test')
  .once('open', () => console.log('Good to go !'))
  .on('error', (error) => {
    console.warn('Warning', error);
  });

لقد واجهت نفس تحذير الإيقاف على النحو التالي:
(العقدة: 2300) تحذير الإيقاف: open() تم إهماله في النمس> = 4.11.0 ، استخدم openUri() بدلاً من ذلك ، أو اضبط الخيار useMongoClient إذا كنت تستخدم connect() أو createConnection() . راجع http://mongoosejs.com/docs/connections.html#use -mongo-client

المحلول

لقد جربت ما يلي وهو يعمل بشكل جيد. لا يعطي تحذيرات الإيقاف.

mongoose.connect ('mongodb: //127.0.0.1: 27017 / your-database-name'، {useMongoClient: true، trustLibrary: global.Promise}) ؛

آمل أن يساعد هذا كل شخص يواجه هذه المشكلة.

لدي نفس المشكلة ولكن عند محاولة الاتصال بخدمة Mongo Atlas ، لا تتصل فقط بخيار {useMo ngoClient: true } وبدونها لن يتم تنفيذ الاتصال.

أي شخص لديه نفس المشكلة؟

لقد قمت بحل مشكلتي بمجرد تغيير mongoose.connect إلى mongoose.createConnection

mongoose.createConnection (config.uri، (err) => {
إذا (يخطئ) {
console.log ('تعذر الاتصال بقاعدة البيانات:' ، يخطئ) ؛
} آخر {
console.log ('متصل بقاعدة البيانات:' + config.db) ؛
}
}) ؛

لقد قمت بحل هذه المشكلة من هذا القبيل (Mongoose 4.12.0 ، NodeJS - 7.10.1)

mongoose.Promise = require('bluebird');
mongoose.connect('mongodb://localhost:27017/books_exchange', {
  useMongoClient: true,
  promiseLibrary: require('bluebird')
}).then(() => {
  var userSchema = new mongoose.Schema({
    name: String,
    password: String
  });
  var User = mongoose.model('User', userSchema);

  var person = new User({
    name: "John",
    password: "qwerty"
  });

  person.save().then(() => {
    console.log('Data saved');
  }).catch(e => {
    console.log(e);
  });
}).catch(e => {
  console.log('Error while DB connecting');
  console.log(e);
});
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات