Mongoose: تقوم FindOne بإرجاع القيمة الافتراضية للحقل غير الموجود.

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

_أولًا: حل بديل للتغلب على هذه المشكلة: _
Model.findOne({id: 'blabla'}).select('email password createdAt').lean().exec()

مشكلة:

أستخدم حقل createdAt -التي تنتهي صلاحيته (TTL 24h ) وقيمة افتراضية ( Date.now ) - في نموذج Users الخاص بي لتخزين الإنشاء معلومات التاريخ للمستخدمين الجدد الذين تم إنشاؤهم.

إذا قام المستخدم بتنشيط الحساب ، يقوم النظام بإزالة الحقل createdAt .
إذا لم يقم المستخدم بتنشيط الحساب ، يقوم النظام بإزالة الحساب من Users collection بعد 24 ساعة.

في عمليات المصادقة الخاصة بي ، أتحقق أولاً من حقل createdAt .
إذا لم يتم تنشيط المستخدم ، تظهر رسالة مثل Account is not activated.

عندما أحاول استخدام طريقة FindOne لغرض إجراء المصادقة أعلاه ، أحصل على Date.now بالرغم من عدم وجود حقل createdAt في المستند بسبب تنشيط المستخدم لحسابه .

الحقل createdAt في نموذج User الخاص بي:
createdAt: { type: Date, expires: '24h', default: Date.now },

طريقتي:
Users.findOne({email: username}, 'email, password, createdAt', function(err, user) {

باستخدام الطريقة أعلاه ، يتم إرجاع قيمة createdAt في كل مرة.

ملاحظة: لقد بحثت في المشكلة ولكن لم أستطع أي شيء.

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

عثرت على نفس المشكلة.
@ vkarpov15 لا ينبغي أن يعمل بهذه الطريقة. على الرغم من تعيين القيمة الافتراضية عند الحفظ ، فمن المضلل تعيينها عند find المستند ، لأنه يجب أن يُرجع البيانات الدقيقة المخزنة في قاعدة البيانات ، أليس كذلك؟ سأصوت لإعادة فتح القضية.

ال 3 كومينتر

هذه هي الطريقة التي تعمل بها الإعدادات الافتراضية ، عندما لا يكون هناك حقل createdAt في doc mongoose سيضيف واحدًا. إذا كنت تريد فقط إضافة createdAt عند إنشاء مستند جديد:

schema.pre('save', function(next) {
  if (this.isNew) {
    this.createdAt = Date.now();
  }
  next();
});

أيضًا ، لا أوصي بفصل الحقول في مشروعك Users.findOne({email: username}, 'email, password, createdAt' /** <-- remove commas here */) بفاصلات.

عثرت على نفس المشكلة.
@ vkarpov15 لا ينبغي أن يعمل بهذه الطريقة. على الرغم من تعيين القيمة الافتراضية عند الحفظ ، فمن المضلل تعيينها عند find المستند ، لأنه يجب أن يُرجع البيانات الدقيقة المخزنة في قاعدة البيانات ، أليس كذلك؟ سأصوت لإعادة فتح القضية.

ليس بالضرورة ، يحتوي النمس على الكثير من الأماكن التي لا يمثل فيها المستند البيانات الدقيقة المخزنة في db: getters ، والظاهريات ، وما إلى ذلك. وفي كلتا الحالتين ، نؤكد على هذا السلوك وتغييره سيؤدي إلى كسر الكثير من رموز الأشخاص ، لذلك لن نغيره ما لم يكن هناك طلب كبير لتغييره. إليك الحل:

createdAt: {
  type: Date,
  default: function() {
    if (this.isNew) { return new Date(); }
    return undefined;
  }
}

سيؤدي هذا إلى تعيين createdAt فقط عند الحفظ في قاعدة البيانات ، ولكن سيكون undefined إذا قمت بتحميل مستند من db و createdAt ليس كذلك يضع.

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