Mongoose: تحذير: النمس: تم إهمال mpromise (مكتبة الوعد الافتراضية للنمس) بـ 4.8.0 و 4.8.1

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

مع إصدارات mongoose 4.8.0 و 4.8.1 (إصدار العقدة 6.9.5 وإصدار MongoDB هو 3.2.11) يتم إنشاء التحذير التالي في المرة الأولى التي يتم فيها حفظ المستند بعد بدء التطبيق (لا يظهر التحذير عند يتم تنفيذ نفس الرمز مرات لاحقة بعد المرة الأولى أثناء استمرار تشغيل التطبيق ، ومع ذلك ، إذا تم إغلاق التطبيق وإعادة تشغيله ، فسيتم إنشاء التحذير في المرة الأولى التي يتم فيها حفظ المستند بعد بدء التطبيق):

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

لا تظهر هذه المشكلة عند استخدام نفس رمز التطبيق بالضبط مع إصدارات mongoose 4.7.9 والإصدارات الأقدم.

الكود الذي يقوم بإعداد اتصال النمس هو كما يلي:

`// Set up mongoose and DB connection
 var mongoose = require('mongoose');
 mongoose.Promise = require('bluebird');
 mongoose.connect('mongodb://localhost:27017/basedir', {server: { poolSize: 5 }});`
help wanted needs clarification

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

كيفية إصلاح تحذير الإيقاف:

var mongoose = require('mongoose');

mongoose.Promise = global.Promise;
var schema = new mongoose.Schema({
 // definition
}, {
 // options
});

module.exports = mongoose.model('foobar', schema);

ال 37 كومينتر

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

لا ، لا ينتج عن مقتطف الاتصال التحذير. مقتطف حفظ المستخدم الجديد التالي هو الكود الذي ينتج عنه التحذير ، ولكن فقط في المرة الأولى التي يتم فيها تنفيذ الكود بعد بدء التطبيق (مرة أخرى ، لا يظهر التحذير في إصدارات mongoose 4.7.9 وما قبلها):

 `                       var curDate = new Date();

                         var newuser = new user(
                         {                             
                                "userName": userName,
                                "hashed_password": hashed_password,
                                "emailReg": false,
                                "email": "~",
                                "firstName": "",
                                "lastName": "",
                                "address.streetAddress": "",
                                "address.city": "",
                                "address.state": "",
                                "address.postalCode": "",
                                "phoneNumbers": [],
                                "accessLevel": 2,
                                "active": true,
                                "trialStartDate": curDate,
                                "maxStorageByteLimit": constants.maxStorageBytesPerUser,
                                "signUpDate": curDate,
                                "passwordResetDate": curDate,
                                "salt": temp,
                                "storageBytesUsed": 0
                            });

                        if (phoneNumberValid != false)
                        {
                            newuser.phoneNumbers.push({
                                "type": "mobile",
                                "number": contactPhoneNumber,
                                "primary": true
                            });
                        }

                        wlogger.crit("Create new user by UserName: " + userName);

                        newuser.save(function (err)
                        {
                            if (err)
                            {
                                wlogger.error(err + " - when saving user "
                                    + " creation by UserName: " + userName);
                                callback({
                                    "response": false,
                                    "res": "User creation failed. "
                                    + " Please try again or contact us at [email protected]"
                                });
                            }
                            else
                            {
                                wlogger.crit("Saved new user info for UserName: "
                                    + userName);

                                return callback({
                                        "response": true,
                                        "res": "Created user by User Name " + userName,
                                        "user_id": newuser._id,
                                        "last_modified_date": curDate
                                });
                            }
                        })`

مخطط المستخدم كما يلي:

`var userSchema = mongoose.Schema({ 
token : String,
email: String,
userName: String,
deviceId: String,
devicePhoneNumber: String, 
hashed_password: String, 
hashed_admin_code: String,
maxStorageByteLimit: { type: Number, default: 1073741824 },
accessLevel: { type: Number, default: 2 },
lastAccessType: Number,
storageBytesUsed: { type: Number, default: 0 },
totalStorageBytesUsed: { type: Number, default: 0 },
deletedStorageBytesUsed: { type: Number, default: 0 },
salt : String,
salt1 : String,
temp_str: String,
syncInProcess: { type: Boolean, default: false },
syncStartDate: { type: Date, default: Date.now },
syncVersion : { type: Number, default: 0 },
active: { type: Boolean, default: false },
disabled: { type: Boolean, default: false },
emailReg: { type: Boolean, default: false },
regPending: { type: Boolean, default: false },
emailChangePending: { type: Boolean, default: false },
regCodeSendCount: { type: Number, default: 0 },
trialStartDate: Date,
signUpDate: Date,
passwordResetDate: Date,
lastLoginDate: Date,
lastModifiedDate: Date,
curLoginDate: Date,
apnDeviceTokens: [ String ],
curSessionIds: [ String ],
curIpAddr: { ipType: String, 
    upper64: Schema.Types.Long,
    lower64: Schema.Types.Long },
firstName: String,
lastName: String,
address: { streetAddress: String,
    city: String,
    state: String, postalCode: String },
phoneNumbers: [ phoneNumbersSchema ],
categories: [ categoriesSchema ],
providerCustomers: [ customerSchema ],
serviceProviders: [ providerSchema ],
ipAddrs: [ ipAddrSchema ],
recentUploads: [ recentUploadSchema ],
recentUploadsGizmo: [ recentUploadSchema ],
recentUploadsLife: [ recentUploadSchema ],
recentUploadsVehicle: [ recentUploadSchema ],
recentUploadsMisc: [ recentUploadSchema ],
recentViews: [ recentViewsSchema ],
recentAdds: [ recentAddsSchema ],
recentAddedFiles: [ recentAddedFilesSchema ],
locations: [ locationSchema ],
inMessages: [ inMessageSchema],
outMessages: [ outMessageSchema ]
  });`

يمكنني تأكيد نفس المشكلة مع mongoose v4.8.1 & node.js v7.5.0.

mongoose.Promise = global.Promise;
mongoose.connect(db.mongodb.uri, db.mongodb.options);
DeprecationWarning: Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead: http://mongoosejs.com/docs/promises.html

@ stevenelson74708 شكرًا على المقتطف ، ولكن ربما لا يكون المخطط نفسه هو المشكلة. ما أبحث عنه أكثر هو كيفية استيراد المخطط واستخدامه بالنسبة إلى وقت فتح الاتصال / تعيين مُنشئ الوعد النمس.

يتم تصدير مخطط قاعدة البيانات من ملف المخطط حيث يتم التصريح عنه على النحو التالي:

`module.exports = mongoose.model('users', userSchema);   `

ويتم استيراد المخطط إلى الملف حيث يتم استخدامه حيث يسمى newuser.save على النحو التالي:

`var user = require('config/models/users');`

يتم عرض مقتطف الاتصال (حيث يكون الاتصال مفتوحًا ويتم تعيين مُنشئ وعد mongoose) المعروض في أول مشاركة لي في ملف app.js الذي يتم تشغيله عند التهيئة أثناء بدء تشغيل التطبيق.

يتم تنفيذ مقتطف newuser.save الموضح في رسالتي الثانية من الملف حيث يتم استيراد مخطط المستخدم ويتم تنفيذ newuser.save عندما يتفاعل المستخدم مع التطبيق ويتسبب في تنفيذ مسار معين ، وذلك بعد تهيئة التطبيق بفترة طويلة اكتمل.

يحدث التحذير فقط في المرة الأولى التي يتم فيها تنفيذ كود newuser.save بعد بدء تشغيل التطبيق على الرغم من تنفيذ نفس كود newuser.save عدة مرات بعد بدء التشغيل ، ولا يبدو أن التحذير يحدث مع إصدارات mongoose 4.7.9 وما قبلها.

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

هل هناك طريقة يمكنني من خلالها رؤية الرمز الخاص بك؟

يوجد أدناه كل الكود (بالترتيب الدقيق) في تهيئة app.js المرتبطة بتكوين النمس ، بما في ذلك إعداد mongoose.Promise. لا يحدث التحذير عند تنفيذ كود التهيئة. لا يحدث التحذير إلا في المرة الأولى التي يتم فيها تنفيذ كود newuser.save (يظهر في رسالتي السابقة) بعد تهيئة التطبيق. هناك استدعاءات findOneAndUpdate يتم تنفيذها قبل الحفظ ولا تسبب التحذير ، لذلك يبدو أن وظيفة الحفظ هي فقط التي تسبب التحذير.

يعد تكوين النمس أحد الأشياء الأولى التي تحدث في التهيئة. هل يجب أن يحدث تكوين النمس لاحقًا في التهيئة مثل وظيفة createServer؟

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

`// Set up mongoose and DB connection
var mongoose = require('mongoose');

mongoose.Promise = require('bluebird');
mongoose.connect('mongodb://localhost:27017/basedir', {server: { poolSize: 5 }});
var conn = mongoose.connection;

conn.once('open', function ()
{
    wlogger.info("Mongoose connection opened on process " + process.pid);
});`

لا ، يمكن أن يأتي التكوين أولاً. هل هذا الملف هو نقطة الدخول لتطبيقك أم أن هناك ملفًا يسبق ذلك؟

ملف app.js هو نقطة الدخول للتطبيق. يمكن استدعاء التطبيق عن طريق كتابة node app.js في سطر الأوامر.

لدي نفس المشكلة مع النمس 4.8.1 والعقدة 7.5.0. أنا أستخدم أيضًا Typescript وأحاول توصيل Bluebird بالوعود. اكتشفت أن التحذير يختفي إذا أضفت هذا الرمز:

`import * as mongoose from 'mongoose';
 import * as bluebird from 'bluebird';

 (<any>mongoose).Promise = bluebird;`

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

// Set up mongoose and DB connection
var mongoose = require('mongoose');

mongoose.Promise = require('bluebird');
mongoose.connect('mongodb://localhost:27017/basedir', {server: { poolSize: 5 }});
var conn = mongoose.connection;

conn.once('open', function ()
{
    console.log('test');
});

لا تطبع هذا التحذير ، لذلك هناك شيء آخر.

vladimirdjurdjevic هذا يعني أنك في مكان ما تستخدم أسلوب mongoose غير المتزامن قبل تعيين lib الوعد. لا أستخدم TS لذا لا أعرف ما إذا كان لذلك أي علاقة به.

لقد قمت بتعيين ملف الوعد lib كما هو موضح أعلاه في ملف app.js وهو نقطة دخول التطبيق ، وبعد ذلك عندما يتم تنفيذ newuser.save الأول (بعد فترة طويلة من تعيين قانون الوعد) كما هو موضح أعلاه ، يحدث التحذير. newuser.save هو أول عملية mongoose غير متزامنة تحدث ، ولكنها تحدث بعد وقت طويل من تعيين الوعد lib للاتصال.

هل يجب تعيين الوعد lib في كل ملف يصل إلى وظائف mongoose غير المتزامنة بدلاً من تعيين الوعد lib مرة واحدة فقط عند تكوين اتصال النمس؟

@ stevenelson74708 لدي نفس المشكلة. ظننت أنني قمت بحلها باستخدام: mongoose.Promise = global.Promise في نقطة دخول التطبيق. يبدو أنك بحاجة إليه في كل ملف يصل إلى وعود النمس. مزعج جدا. فقط قم بتعيين تكوين النمس في ملف منفصل ، وقم بتصديره واستيراده عند الحاجة.

لاحظت أيضًا مؤخرًا أنني أتلقى هذا التحذير ، على الرغم من أنني وضعت الوعد في ملف app.js الخاص بي. لقد حاولت استخدام كل من بلوبيرد وبلوبيرد مع نفس النتائج.

// FILE: app.js
import bluebird from 'bluebird';
import mongoose from 'mongoose';

// use bluebird as default promise library
mongoose.Promise = bluebird;

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

// FILE: SessionModel.js
import bluebird from 'bluebird';
import mongoose from 'mongoose';

// TODO: remove this redundant bit of code
// use bluebird as default promise library
mongoose.Promise = bluebird;

SessionSchema.methods.getUser = function(callback) {
  return mongoose.model('User').findById(this.user, callback);
};

mcfarljw من الأفضل أن تفعل شيئًا مثل هذا:

// config.js
const bluebird = require('bluebird');
const mongoose = require('mongoose');
mongoose.Promise = bluebird;
mongoose.connect('mongodb://localhost:27017/myApp)
module.exports = { mongoose }
// SessionModel.js
const { mongoose } = require('./config')

SessionSchema.methods.getUser = function(callback) {
  return mongoose.model('User').findById(this.user, callback);
};

بهذه الطريقة لن تضطر إلى كتابة "mongoose.Promise = bluebird" عدة مرات :)

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

نعم ، يبدو أن إعداد mongoose.Promise في ملفات المخطط حيث يتم تصدير mongoose.model يلغي التحذير في الإصدار 4.8 من mongoose والإصدارات الأحدث.

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

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

لدي نفس المشكلة في وضع النمس العالمي.

لقد تعقبت الأمر ، ويمكنه تعيين بلوبيرد بشكل صحيح إلى الوعد_المقدم ولكن عندما حاولت استعادة الوعد ، فإنه سيعيد ES6.

أنا فقط مررت وأضفت

mongoose.Promise = global.Promise

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

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

مرحبا
لدي بعض أمثلة التعليمات البرمجية التي تسبب المشكلة

import mongoose from 'mongoose';

mongoose.Promise = Promise;

import Test from './test.model';

mongoose.connect(uri, options);
mongoose.connection.on('error', err => console.error(`MongoDB connection error: ${err}`));

Test.create({ name: 'Hi'})
  .then(() => Test.findOne({}))
  .then(res => res.save())
  .then(() => console.log('Done'));

(test.model هو مجرد نموذج بسيط مع حقل واحد للاسم)

لسبب ما ، تظهر المشكلة أولاً عند تنفيذ res.save(); . بدونها كل شيء يعمل كالمعتاد.

أعتقد أن هذه المشكلة تأتي من تغيير Babel للترتيب عند تحويل الشفرة. عندما تنقل بابل ، فإنها تنقل جميع الواردات إلى الأعلى. لذلك عندما يتم استيراد test.model في المثال الخاص بي ، لا يزال يتم تعيين Promise-library إلى mpromise.

أنا أستخدم Node.js 6.10.0 و Mongoose 4.8.5 وقد حصلت على هذه المشكلة.

أحفظ كائن المستخدم الخاص بي:

var newUser = User({
    login       : 'john',
    password    : 'secret',
    firstname   : 'John',
    lastname    : 'Doe',
    avatar      : 'avatar.png'
});

newUser.save(function(err){
    if(err) throw err;

    console.log('User created !');
});

ولدي نفس الخطأ. حاولت بهذه الطريقة:

mongoose.Promise = require('bluebird');
mongoose.connect(conf.dbpath);

وبهذه الطريقة:

mongoose.Promise = global.Promise;
mongoose.connect(conf.dbpath);

لكن لدي مرة أخرى التحذير الموقوف. كيف يمكنني اصلاح هذا ؟

كيفية إصلاح تحذير الإيقاف:

var mongoose = require('mongoose');

mongoose.Promise = global.Promise;
var schema = new mongoose.Schema({
 // definition
}, {
 // options
});

module.exports = mongoose.model('foobar', schema);

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

أعتقد أن @ stevenelson74708 لديه نقطة ممتازة عندما يقول At this point it's unclear to me as to exactly what the "proper" mongoose setup/configuration to avoid the warning is.

نعم ، سيكون الإصلاح هو العودة عبر جميع ملفات نماذج النمس وإضافة mongoose.Promise = global.Promise بعد الاستيراد ، ولكن نظرًا لأن هذه المشكلة قد ظهرت مؤخرًا فقط ، سيكون من الجيد الحصول على إجابة أكثر واقعية فيما يتعلق بالنوايا أو أسباب ورائها. أنا غير متأكد في هذه المرحلة ما إذا كانت مشكلة ناجمة عن النمس أو بابل أو مزيج من الاثنين.

من المحتمل خدعة # 5030. حاول الترقية إلى> = 4.9.1.

للتسجيل ، نجح حل

في البداية يأتي الحل من @ steve-p-com. ليس منbricss.
@ vkarpov15 نفس التحذير مع 4.9.3.
stillesjo لا شيء مع بابل. يحدث التحذير أيضًا على nativ بدون Babel على Node 7.8.0.

ليس لدي أي تحذيرات منذ الإصدار 4.9.3 🌷

حتى عندما وضعنا mongoose.Promise = global.Promise; على كل نموذج ، أعتقد أنه ليس إصلاحًا صحيحًا؟ لماذا لا تستخدم global.Promise كإعداد افتراضي وتسمح للمستخدمين بالتغيير إذا أرادوا ذلك؟

وحدة اختبار النماذج الخاصة بي. يجب أن أدرجه حتى لا نرى التحذير عند إجراء الاختبارات محليًا أو على CI.
أنا أستخدم "mongoose": "4.10.4" مع العقدة v7.10.0

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

فقط لإضافة حل DRY إلى هذا ، قم بإعداده حيث تقوم بتهيئة الاتصال بقاعدة بيانات teh بدلاً من الإعداد داخل كل نموذج.

const mongoose = require('mongoose');
mongoose.Promise = global.Promise;
mongoose.connect('mongodb://...');

يبدو أنه يعمل

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

هذا يناسبني
""
استيراد النمس من "النمس" ؛
استيراد التكوين من "./config" ؛
استيراد بلوبيرد من "بلوبيرد" ؛

تصدير رد الاتصال الافتراضي => {
النمس الوعد = بلوبيرد.
// الاتصال بقاعدة البيانات من مثيل قاعدة البيانات في ملف التكوين
let db = mongoose.connect (config.mongoUrl، {useMongoClient: true}) ؛
رد الاتصال (ديسيبل) ؛
}
""

بهذه الطريقة أفعل ذلك.

var colors = require('colors');
var mongo = require('mongodb');
var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');

var db = mongoose.connection;

mongoose.connect('mongodb://localhost:27017/db', { useMongoClient: true })
.then(function(){
  console.log(" Connected to dbName ".green);

}).catch(err => console.error(err));

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

أنا على 4.13.9 وما زال هذا موجودًا. حل @ Gilbert136 يصلح هذا الأمر ،

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