Mongoose: تحذير الإيقاف

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

أتلقى هذا التحذير

(node:3341) DeprecationWarning: Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead: http://mongoosejs.com/docs/promises.html

بعد أن أفعل

driver.createCar({
          carName: 'jeep',
          availableSeats: 4,
        }, callback);

السائق هو مثيل لفئة السائق

const carSchema = new Schema({
  carName: String,
  availableSeats: Number,
  createdOn: { type: Date, default: Date.now },
});
const driverSchema = new Schema({
  email: String,
  name: String,
  city: String,
  phoneNumber: String,
  cars: [carSchema],
  userId: {
    type: Schema.Types.ObjectId,
    required: true,
  },
  createdOn: { type: Date, default: Date.now },
});
const DriverModel = mongoose.model('Driver', driverSchema);

class Driver extends DriverModel {
  getCurrentDate() {
    return moment().format();
  }
  create(cb) {
    // save driver
    this.createdOn = this.getCurrentDate();
    this.save(cb);
  }
  remove(cb) {
    super.remove({
      _id: this._id,
    }, cb);
  }
  createCar(carData, cb) {
    this.cars.push(carData);
    this.save(cb);
  }
  getCars() {
    return this.cars;
  }
}

أي أفكار حول الخطأ الذي أفعله؟

help

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

لقد حللت ذلك التحذير

mongoose.Promise = global.Promise;

قبل الاتصال بـ mongoose.connect مباشرة

// connect to mongo function
core.connect = function connect(opts) {
  mongoose.Promise = global.Promise;
  mongoose.connect(`mongodb://${opts.server}:${opts.port}/${opts.db}`);
  return mongoose.connection;
};

ال 79 كومينتر

حسنًا ، هل تستخدم الوعود في أي مكان؟ لا يجب أن تتلقى هذا التحذير ما لم تستخدم الوعود ...

لا أنا لا أستعمل الوعود

لقد بدأت للتو في الحصول على هذه المشكلة أيضًا. عدم استخدام الوعود التي أعرفها!

لقد حللت ذلك التحذير

mongoose.Promise = global.Promise;

قبل الاتصال بـ mongoose.connect مباشرة

// connect to mongo function
core.connect = function connect(opts) {
  mongoose.Promise = global.Promise;
  mongoose.connect(`mongodb://${opts.server}:${opts.port}/${opts.db}`);
  return mongoose.connection;
};

نعم ، من المفترض أن يخبرك هذا التحذير بتغيير الوعد الافتراضي للنمس إذا كنت تستخدم الوعود ، لكن لا ينبغي أن يحدث ذلك ما لم تتصل بـ. ثم في مكان ما

أحصل عليه ولكني أحصل عليه فقط حيث أحفظ كائنًا ثم أعدله في رد الاتصال وحفظه مرة أخرى

لقد جربت نهج SAudelOG لتعيين وعد للنمس قبل اتصال النمس ولكني ما زلت أتلقى هذا الخطأ

أنا أستخدم وظائف غير متزامنة es7 ، ويتم حظر الرمز الخاص بي عندما أحاول استخدام Model.findOne ({})

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

فيما يلي قائمة بالتبعية التي أستخدمها

  "dependencies": {
    "async": "^2.0.0-rc.6",
    "body-parser": "^1.15.0",
    "bower": "^1.7.7",
    "compression": "^1.6.1",
    "connect-mongo": "^1.2.1",
    "consolidate": "^0.14.1",
    "cookie-parser": "^1.4.3",
    "express": "^4.13.4",
    "express-jwt": "^3.4.0",
    "express-session": "^1.13.0",
    "express-validator": "^2.20.8",
    "faker": "^3.1.0",
    "http-errors": "^1.5.0",
    "jsonwebtoken": "^7.0.1",
    "lodash": "^4.13.1",
    "method-override": "^2.3.5",
    "mongoose": "^4.4.3",
    "mongoose-beautiful-unique-validation": "^3.0.0",
    "mongoose-delete": "^0.3.3",
    "mongoose-validator": "^1.2.5",
    "morgan": "^1.6.1",
    "passport": "^0.3.2",
    "passport-local": "^1.0.0",
    "swig": "^1.4.2"
  }

أنا لا أستخدم الإضافات ولا الوعود وأحصل على هذا التحذير أيضًا (على [email protected]).

تشغيل تطبيقي مع "- إهمال التتبع" لدي:

Trace: Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead:
http://mongoosejs.com/docs/promises.html
    at Object.exports._printDeprecationMessage (internal/util.js:30:13)
    at Promise.deprecated [as then] (internal/util.js:54:22)
    at fnWrapper (.\node_modules\mongoose\node_modules\hooks-fixed\hooks.js:188:11)
    at EmbeddedDocument.Object.defineProperty.value.fn (.\node_modules\mongoose\lib\schema.js:219:11)
    at _next (.\node_modules\mongoose\node_modules\hooks-fixed\hooks.js:62:30)
    at fnWrapper (.\node_modules\mongoose\node_modules\hooks-fixed\hooks.js:186:18)
    at EmbeddedDocument.Object.defineProperty.value.fn (.\node_modules\mongoose\lib\schema.js:173:18)
    at EmbeddedDocument._next (.\node_modules\mongoose\node_modules\hooks-fixed\hooks.js:62:30)
    at EmbeddedDocument.proto.(anonymous function) [as $__original_save] (.\node_modules\mongoose\node_modules\hooks-fixed\hooks.js:108:20)
    at .\node_modules\mongoose\lib\document.js:1917:24
    at new Promise.ES6 (.\node_modules\mongoose\lib\promise.js:45:3)
    at EmbeddedDocument.wrappedPointCut [as save] (.\node_modules\mongoose\lib\document.js:1893:14)
    at async.each.i (.\node_modules\mongoose\lib\schema.js:225:18)
    at .\node_modules\async\lib\async.js:181:20
    at Object.async.forEachOf.async.eachOf (.\node_modules\async\lib\async.js:233:13)
    at Object.async.forEach.async.each (.\node_modules\async\lib\async.js:209:22)
    at model.Object.defineProperty.value.fn (.\node_modules\mongoose\lib\schema.js:223:15)
    at _next (.\node_modules\mongoose\node_modules\hooks-fixed\hooks.js:62:30)
    at fnWrapper (.\node_modules\mongoose\node_modules\hooks-fixed\hooks.js:186:18)
    at .\node_modules\mongoose\lib\schema.js:200:17
    at .\node_modules\mongoose\node_modules\kareem\index.js:127:16
    at nextTickCallbackWith0Args (node.js:420:9)
    at process._tickDomainCallback (node.js:390:13)

لدي نفس المشكلة ، إذا كانت هناك أي مساعدة ، فسيتم تشغيلها على وجه التحديد عندما أحاول إنشاء مستندات تحتوي على مجموعة من المستندات الثانوية بداخلها ، شيء مثل:

var data = {
  field: 'value',
  another_field: [{subdocfield1: 'value', subdocfield2: 'value'}]
} 

mySchema.create(data, cb)

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

var data = {
  field: 'value'
} 

mySchema.create(data, cb)

_ ملاحظة: _ mongoose.Promise = global.Promise قام بحل مشكلة التحذير بالنسبة لي بالرغم من ذلك

مواجهة نفس تحذير الإهلاك عند استخدام remove() في مستند. أنا لا أستخدم الوعود هنا أو في أي مكان آخر في الكود الخاص بي.

لقد تلقيت هذا الخطأ للتو عند استخدام Model.create(objects, callback); ، فربما لم يتم نشر هذا الإصلاح في npm حتى الآن؟

الحصول على هذا ، سعيد لقراءته ليس مقلقًا. سألقي نظرة فاحصة على هذا للمساعدة في تصحيح الأخطاء عند حدوث ذلك.

الحصول على هذا أيضًا ، وأنا لا أستخدم وعود النمس في أي مكان.

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

تواجه هذه المشكلة على العقدة v4.4.6 بينما في v4.4.2 يبدو أن هذا يعمل

SKatiyar رمز عينة من فضلك

نفس الشيء معي ، تلقيت هذه الرسالة بعد استدعاء طريقة save () ، وهو ما يكفي لي لأهتم

هذا يعمل! قبل mongoose.connect(MONGO_URI); أضف mongoose.Promise = global.Promise;

الكود التالي كافٍ لإعادة إنتاجه من طرفي:

const mongoose = require('mongoose');
const schema = new mongoose.Schema({
  data: { type: Number }
});
const Model = mongoose.model('schema', schema);
mongoose.connect('mongodb://127.0.0.1:27017/somedatabase');
const newModel = new Model({ data: 1 });
const save = newModel.save(() => {
  console.log('saved model');
});
console.log(typeof save.then); //=> 'function'

الشيء الغريب الذي يمكنني رؤيته هنا هو أن استخدام newModel.save(callback) لا يزال يعيد الوعد (أو أفترض أن هذا وعد ، لأن نوع .then هو 'function' ). هل هذا سلوك متوقع؟

هذه هي إصداراتي:
العقدة: v6.3.1
النمس: v4.5.8

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

dvlsg نعم ، هذا هو السلوك المتوقع حاليًا ، سيعيد الحفظ دائمًا وعدًا حتى إذا نجحت في إعادة الاتصال

حسنًا ، أعتقد أن هذا من شأنه أن يفسر على الأقل لماذا يرى الناس تحذير الوعد حتى عندما لا يعتقدون أنهم يستخدمون الوعود.

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

إنه خطأي ، yup .save () يعيد الوعد لذا هذا متوقع ، لكن التحذير جعلني أتساءل. http://mongoosejs.com/docs/promises.html (كان عليك فقط قراءة الفقرة الأولى 🎱)

لذا ، يُرجع .save() وعدًا ولكن لا يجب أن تتلقى هذا التحذير إلا إذا اتصلت بـ .then() . إذا تلقيت هذا التحذير دون استدعاء .then() في الكود الخاص بك ، فهذا يعني أن النمس يستخدم الوعد في مكان ما حيث لا ينبغي أن يفعل ذلك ، لذا يرجى فتح مشكلة منفصلة مع نماذج التعليمات البرمجية: +1:

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

واجهت هذه المشكلة ولم تنجح طريقة () aModel.save لوضعها في MongoDB. لقد استغرق الأمر بعض الوقت لجذر سبب هذه المشكلة. بعد تطبيق "mongoose.Promise = global.Promise؛" نجح ذلك.

كنت أستخدم "النمس": "^ 4.5.9".

يجب أن يعمل الحفظ بشكل جيد مع قانون الوعد الافتراضي ، هل يمكنك تقديم عينة تعليمات برمجية؟

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

أنت على حق. لقد حاولت للتو وفشلت في إعادة إنشاء نتيجة حفظ الحظر من نقطة الصفر مع التحذير.

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

بالنسبة لي ، ينبثق هذا السجل في وحدة التحكم كلما استخدمت.

لذلك ، وفقًا للمستندات ، أنا أمرر

'use strict';
var Promise = require('bluebird');

// Development specific configuration
// ==================================
module.exports = {
  // MongoDB connection options
  mongo: {
    uri: 'mongodb://localhost/fullstack-dev',
    options: {
      promiseLibrary: Promise
    }
  },
  // .. other config
};

ثم في ملفي الرئيسي القيام به

'use strict';

// Set default node environment to development
process.env.NODE_ENV = process.env.NODE_ENV || 'development';
process.env.BLUEBIRD_DEBUG = 1;
var mongoose = require('mongoose');
var config = require(path.join(__dirname, 'server', 'config', 'environment'));

// Connect to database
var db = mongoose.connect(config.mongo.uri, config.mongo.options);
mongoose.connection.on('error', function(err) {
  console.error('MongoDB connection error: ' + err);
  process.exit(-1);
});

وما زلت أتلقى تحذير الإيقاف عند تنفيذ query.exec . أي اقتراحات بشأن ما أفعله خطأ؟
[تحرير: إضافة نسختين النمس والبلوبيرد]
أنا أستخدم النمس ^4.6.1 ، بلوبيرد ^3.4.6

أتلقى تحذيرًا أيضًا بشأن النمس 4.6.1 والعقدة 4.4.5

    var mongoose = require('mongoose');
    mongoose.Promise = global.Promise;
    mongoose.connect(dbConfig);
    var connection = mongoose.connection;

@ manu29d يبدو أنك لم تقم بتعيين mongoose.Promise = bluebird

@ vkarpov15 أعتقد أنني كذلك. لقد أعلنت var Promise = في بداية نص التكوين ثم promiseLibrary: Promise في وقت لاحق. (انظر إلى مقتطف الشفرة الأول في الأمثلة)

أيضًا ، حاولت كتابة promiseLibrary: require('bluebird') كما هو وارد في المستندات.

لا أرى mongoose.Promise = require('bluebird') في أي مكان في نموذج الرمز الذي قدمته. var Promise = require('bluebird'); _ ليس صحيحًا.

@ vkarpov15 أشير إلى http://mongoosejs.com/docs/promises.html#promises -for-the-mongodb-driver

هل هذا لا يزال ساري المفعول؟ ليس لدي الوقت للتحقق من الكود ما إذا كان هذا الخيار ( promiseLibrary ) مدعومًا في التكوين أو تمت إزالته.

يعمل إعداد mongoose.Promise = global.Promise بالرغم من ذلك.

mongoose.Promise = global.Promise
قبل أن يعمل لي أيضًا mongoose.connect .

أنا لا أستخدم الوعود وأتصل بـ mongoose.Promise = global.Promise قبل أعمال الاتصال.

@ manu29d هذه المستندات صحيحة ، ومع ذلك ، إذا قرأتها بالفعل ، فسترى أن الخيار promiseLibrary يؤثر فقط على محرك mongodb الأساسي ، _not_ mongoose.

@ zubair-farooqui-10p البرنامج النصي أدناه لا يطلق التحذير بالنسبة لي في 4.5.9 أو 4.6.3:

'use strict';

Error.stackTraceLimit = Infinity;

var assert = require('assert');
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

mongoose.connect('mongodb://localhost/gh4291');
mongoose.set('debug', true);

var connection = mongoose.connection;

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

ليس بشكل عام ، لأن الطريقة التي تعمل بها آلية تبديل lib الخاصة بالنمس تختلف تمامًا عن طريقة عمل mongodb driver. في mongoose ، إنها مجرد خاصية يمكنك تعيينها على الكائن الشامل mongoose في أي وقت ، بينما في mongodb يعد خيار اتصال ، لذلك يمكن أن يكون للاتصالات المختلفة رسائل وعد مختلفة ولكن يمكنك فقط تعيين lib الوعد عندما تكون متصلاً ، ليس بعد ذلك. ليس من الأولويات حقًا التوفيق بين هذه الاختلافات في أجهزة الصراف الآلي.

لماذا يحدث هذا عند حفظ مستند يحتوي على مجموعة من السلاسل ، يمكن لأي شخص أن يشرحها بالتفصيل

أحصل عليه أيضًا بعد الاتصال بـ .createConnecton() . الشيء المضحك الذي استخدمه Q ... لكن! لكنني أفضل القيام بذلك بعد أن أقوم بإنشاء اتصال ، لأنني (وأنا متأكد من أن الجميع) أفضل القيام بذلك في قالب تصريح var. بمعنى آخر

var mongoose = require('mongoose'),
        connection1 = mongoose.createConnection(dbConn1Str),
        connection2 = mongoose.createConnection(dbConn2Str)
;
mongoose.Promise = Q.makePromise;

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

var mongoose = require('mongoose'),
        connection1, connection2
;
mongoose.Promise = Q.makePromise;
connection1 = mongoose.createConnection(dbConn1Str)
connection2 = mongoose.createConnection(dbConn2Str)

ليست مشكلة كبيرة ، ولكن صرامة ...

نعم هذا هو الطريق للذهاب. سوف يستخدم Mongoose 4.x mpromise حتى تخبره بعدم القيام بذلك.

أرى هذا عند استخدام مكالمة find () العادية مع مساعد الاستعلام. لا أستخدم then في أي مكان.

BookStore.find().byUsingQueryHelper(1,2,3).lean().exec(function (err, docs) { ... })

سجل:

Mongoose: bookstores.find ({الموقع: {'$ near': [28.742712943610545، -13.865369983731426]، '$ maxDistance': 0.0012556898446083817}} ، {limit: 10 ، الحقول: undefined})

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

pronebird لسوء الحظ هذه هي الطريقة التي يعمل بها exec() داخليًا ، عمليات رد النداء إلى exec() تمر فعلاً بوعد. فقط قم بعمل mongoose.Promise = global.Promise ولن تحصل على هذا التحذير بعد الآن.

pronebird لقد تلقيت نفس الخطأ عند النشر ، واكتشفت أن المخطط الخاص بي يحتوي على قيمة افتراضية كما هو موضح أدناه ولا يتطابق مع القيمة المنشورة أدناه
وظيفة: {
اكتب: سلسلة ،
تعداد: ["العميل" ، "المسؤول"] ،
الافتراضي: "العميل"
}
أنا أنشر الدور: مشرف ويجب أن يكون مشرفًا
آمل أن تساعد هذه الإجابة شخصًا ما. شكرا

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

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

تختفي بإضافة mongoose.Promise = global.Promise؛ قبل الاتصال بالديسيبل
mongoose.connect ('mongodb: // localhost: 27017 / mydb') ؛

Muhammedalbayati أعتقد أن @ vkarpov15 أوضح سبب ظهور هذا التحذير. يستخدم Mongoose وعودًا داخليًا في حدود exec .

ES6 "yiled" لا يعمل مع طريقة doc.save بعد أن قمت بترقية mongoose إلى v.4.7.7.
أخيرًا ، هذا فقط لأن mongoose.Promise = global.Promise . بعد أن أزيل هذا لا يزال تحذيرًا

Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead:

أعتقد أن [email protected] لديه وحدة الوعد الخاصة به. هل هذا صحيح؟؟
هل يعرفها أحد؟

إنه نمس يضيف ليب بوعود es6.

قضية غبية جدا!

ملاحظة: دفع هذا التحذير سخيف حتى العضو التناسلي النسوي الخاص بك!

بصفتي زميلًا متحدثًا روسيًا ، أعتذر عن السلوك الذي أظهره هذا الكيان الصغير حافزًا لك على عدم ترجمة ما كتبه هنا.

@ vkarpov15 لقد جربت كلاً من mongoose.Promise = global.Promise; و mongoose.Promise = require('bluebird'); .

للأسف ، ما زلت أتلقى تحذيرًا بشأن الإيقاف.

_ هل هناك شيء خاطئ أفعله؟ _

const mongoose = require('mongoose');

mongoose.Promise = global.Promise;

mongoose.connect('mongodb://localhost/users_test');

mongoose.connection
  .once('open', () => {
    console.log('connectecd to db')
  })
  .on('error', (err) => {
    console.warn('Warning', err)
  });

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

أيضا ما هو إصدار النمس / العقدة التي تستخدمها؟

varunjayaraman لا يتم استيراد هذا الملف إلى أي مكان آخر. ومع ذلك ، أقوم باستيراد mongoose في ملف مخطط user.js الخاص بي ثم استخدم مخطط المستخدم هذا في بعض اختباراتي.

const mongoose = require('mongoose')
const Schema = mongoose.Schema
const UserSchema = new Schema({
  name: String,
})
const User = mongoose.model('user', UserSchema)
module.exports = User

عقدة v7.0.0النمس v4.8.1

protoEvangelium هل تتلقى التحذير في تطبيقك أم في اختباراتك فقط؟

لقد واجهت نفس المشكلة مرة واحدة - كان الجاني هو وحدة أخرى ، والتي استخدمت تبعية النمس الخاصة بها. تحتوي هذه الوحدات على شيء مثل "mongoose": "^4.1.1" في package.json الخاصة بهم ، ولكن نظرًا لأنه يتم تحديث هذه الوحدات على أساس سنوي (إذا تم تحديثها على الإطلاق) - فإنها تفتقر إلى جزء التكوين الوعد. protoEvangelium هل تستخدم أي وحدات أخرى؟

SAudelOG شكرا على الإجابة

varunjayaraman لقد بدأت فقط في اختبار إضافة المستخدمين إلى Mongo باستخدام Mongoose و Mocha. إنه مشروع مجردة حتى الآن.

Spown أنا أستخدم:
"mocha": "^3.2.0", "mongoose": "^4.8.1", "nodemon": "^1.11.0"

شكرا :)

protoEvangelium انتظر دقيقة ، هل جربت هذا؟

const mongoose = require('mongoose')
mongoose.Promise = global.Promise // <--
const Schema = mongoose.Schema
const UserSchema = new Schema({
  name: String,
})
const User = mongoose.model('user', UserSchema)
module.exports = User

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

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

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

شكرا جزيلا!

Spown شكرا لك سيدي! كانت هذه هي القضية. ومن المثير للاهتمام ، أنني حددت mongoose.Promise = global.Promise; في ملف test_helper.js الخاص بي مباشرة قبل الاتصال بـ Mongoose. لقد قمت بتحويل mongoose.Promise = global.Promise; إلى ملفي حيث قمت بتعريف المخطط وهو يعمل !!!! لا مزيد من تحذير الإيقاف 👍

const mongoose = require('mongoose')
mongoose.Promise = global.Promise;
const Schema = mongoose.Schema

أواجه هذه المشكلة عند استخدام ظاهريات "قابلة للتجميع" في مخططاتي. عند تشغيل تطبيقي بـ --trace-deprecations ، يمكنك رؤية الجاني:

(node:8846) DeprecationWarning: Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead: http://mongoosejs.com/docs/promises.html
    at model.wrappedPointCut [as init] (/Users/fleavamini/Projects/stellium/stellium-express/node_modules/mongoose/lib/services/model/applyHooks.js:141:26)
    at completeMany (/Users/fleavamini/Projects/stellium/stellium-express/node_modules/mongoose/lib/query.js:1254:12)
    at Immediate.cb (/Users/fleavamini/Projects/stellium/stellium-express/node_modules/mongoose/lib/query.js:1117:13)
    at Immediate.<anonymous> (/Users/fleavamini/Projects/stellium/stellium-express/node_modules/mquery/lib/utils.js:137:16)
    at runCallback (timers.js:651:20)
    at tryOnImmediate (timers.js:624:5)
    at processImmediate [as _immediateCallback] (timers.js:596:5)

لقد حددت الوعد (لاحظ أنني أستخدم TypeScript):

import * as mongoose from "mongoose";
(<any>mongoose).Promise = global.Promise;
mongoose.connect('mongodb://localhost/blah')

أيه أفكار؟ هل يجب أن أضع الوعد على كل نموذج يستخدم افتراضية "قابلة للتجميع"؟ انتظر ، سأحاول ذلك وأعود بكيفية سير الأمور.

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

في حالتي ، كانت مجموعة website_pages أول مجموعة يتم الاستعلام عنها من قبل نظامي ، حيث أدى تعيين mongoose.Promise إلى global.Promise في هذا المخطط وحده إلى حل المشكلة ولم أكن كذلك ر مطلوب لتعيينه في جميع المخططات.

لماذا لا تستخدم وعود ES6؟ أليست متوفرة في كل مكان الآن؟

mongoose.Promise = Promise; // eh?

شكرًا Spown ، لقد واجهت نفس تحذير الإيقاف منذ أن وضعت mongoose.Promise = global.Promise بعد استيراد النموذج. الآن ذهب تحذير الإيقاف.

التصريح عن mongoose.Promise = global.Promise في ملف النموذج كما هو مذكور في Spown Works . هذا بسبب التخزين المؤقت للعقدة للوحدات النمطية المطلوبة . هذا يبدو متقلب بالرغم من ذلك. ألا توجد طريقة للتأكد من تحميل test_helpers.js أولاً حتى أتمكن من تعيين وظيفة وعد النمس في هذا الملف؟

أليست هناك طريقة للتأكد من أن ...

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

نعم أفعل نفس الشيء مثلSpown. إنها بالتأكيد ليست مثالية ، لكنها الطريقة الوحيدة للحفاظ على توافق النمس مع الإصدارات السابقة حتى الإصدار الرئيسي التالي عندما نتمكن من إهمال mpromise تمامًا

libs / mongoose.js

import mongoose from 'mongoose'; // real mongoose only be required once here 

mongoose.Promise = global.Promise; // so that you dont have to do this on every require
const Schema = mongoose.Schema;

export {
  mongoose as default, // kind of singleton
  mongoose,
  Schema,
};

index.js

import mongoose from './libs/mongoose';
mongoose.connect(process.env.MONGODB_URI);

النماذج / user.js

import {mongoose, Schema} from '../libs/mongoose';

export default mongoose.model('User', new Schema({
  name: String,
  password: String,
}));

howard تتطلب () يتم تخزين المكالمات مؤقتًا.

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

@ sh-guti أعتقد ذلك ، لدي نفس المشكلة وهذا الجزء من الكود يحل ذلك.

في هذه المرحلة ، لا أعرف ما إذا كنت سأستخدم عمليات الاسترجاعات أو الوعود. مضحك جدا.

يستخدم

mongoose.createConnection(URI)

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

التوافق الوراء. كان Mongoose 4.x موجودًا لأكثر من عام قبل إطلاق العقدة 4. سنقوم بالتبديل مع الإصدار التالف التالي للخلف.

متى يكون هذا؟

يتسبب mongoose.createConnection (URI) في حدوث خطأ غريب جدًا في Mongoose ، حيث أن ساعات من التصحيح مع الاستعلامات لا تعمل. عاد في النهاية إلى

mongoose.connect (process.env.MONGODB) ؛ من mongoose.createConnection (process.env.MONGODB)

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

MickL سيكون لدينا RC0 في الأسابيع القليلة القادمة ، تابع mongoose على twitter أو انضم إلى قناة Slack للحصول على التحديثات

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