Mongoose: Model.create تم حل الوعد بالرغم من عدم حفظ أي مستند

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

مرحبا بالجميع،

أنا أستخدم إصدار mongoose 5.0.3 وإصدار العقدة 9.4.0. وفقًا لنموذج التوثيق النمس ، يجب أن يعيد الإنشاء الوعد الذي أفترض أنه قد تم حله أثناء حفظ المستند الذي تم إنشاؤه في قاعدة البيانات. ومع ذلك ، كما هو موضح في الكود أدناه ، يبدو أن الوعد قد تم الوفاء به قبل حفظ المستند في قاعدة البيانات.

async function test(){

    let schema = new mongoose.Schema({a: String});

    let model = mongoose.model('test', schema);

    await model.remove({}).exec();

    await model.create({ a: 'test'}, 
       (err,result)=> {console.log('created');});

    await model.findOneAndUpdate(
        { a : 'test' } , 
        { a: 'newValue'}
    )
    .exec((err, result) => {
        console.log('update : '+result);
    });

    await model.find({a: 'test'},(err,result) => {
        console.log(result); 
    });

}

output in terminal : 
    update : null
    found :
    created

findOneAndUpdate لا تجد أي مستند. بالإضافة إلى أن كلمة "تم الإنشاء" تظهر في نهاية المحطة ، ومن ثم يتم تنفيذ رد نداء التابع create كما لو لم يكن الانتظار ينتظر تنفيذ المهمة غير المتزامنة 'create'.

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

async function test(){

    let schema = new mongoose.Schema({a: String});

    let model = mongoose.model('test', schema);

    await model.remove({}).exec();

    await new Promise((resolve,reject) => {
        model.create({ a: 'test'}, 
       (err,result)=> {
            console.log('created');
            resolve();
        });
    });

    await model.findOneAndUpdate(
        { a : 'test' } , 
        { a: 'newValue'}
    )
    .exec((err, result) => {
        console.log('update : '+result);
    });

    await model.find({a: 'newValue'},(err,result) => {
        console.log('found : ' +result); 
    });

}

output in terminal: 
     created
     update : { _id: 5a735fbc1fe826233014d62d, a: 'test', __v: 0 }
     found : { _id: 5a735fbc1fe826233014d62d, a: 'newValue', __v: 0 }

الآن لدينا النتيجة المتوقعة.

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

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

أعتقد أنني أتذكر أنني قرأت في مستندات 4.x أنه إذا قمت بتمرير رد اتصال إلى model.create ، فلن يعود عليك بوعد.

let x = model.create({ a: 'test' }, () => {})
  x.then(console.log(x)) //TypeError: Cannot read property 'then' of undefined

إذا قمت بسحب رد الاتصال:

let x = model.create({ a: 'test' })
  x.then(console.log(x)) // Promise { <pending> }

المصدر 5.x للنموذج model.js يحمل هذا الاستدعاء uses.promiseOrCallback

ال 3 كومينتر

أعتقد أنني أتذكر أنني قرأت في مستندات 4.x أنه إذا قمت بتمرير رد اتصال إلى model.create ، فلن يعود عليك بوعد.

let x = model.create({ a: 'test' }, () => {})
  x.then(console.log(x)) //TypeError: Cannot read property 'then' of undefined

إذا قمت بسحب رد الاتصال:

let x = model.create({ a: 'test' })
  x.then(console.log(x)) // Promise { <pending> }

المصدر 5.x للنموذج model.js يحمل هذا الاستدعاء uses.promiseOrCallback

نعم ، lineus صحيح ، هل يمكنني إغلاق هذه المشكلة CodeurSauvage ؟

CodeurSauvagelineus هو الصحيح، النمس 5 لا يرجع الوعد إذا تم تحديد رد. يعمل البرنامج النصي الخاص بك إذا قمت باستبدال:

    await model.create({ a: 'test'}, 
       (err,result)=> {console.log('created');});

مع:

    await model.create({ a: 'test'}).then(result => console.log('created'));
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات