_أولًا: حل بديل للتغلب على هذه المشكلة: _
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
في كل مرة.
ملاحظة: لقد بحثت في المشكلة ولكن لم أستطع أي شيء.
هذه هي الطريقة التي تعمل بها الإعدادات الافتراضية ، عندما لا يكون هناك حقل 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
ليس كذلك يضع.
التعليق الأكثر فائدة
عثرت على نفس المشكلة.
@ vkarpov15 لا ينبغي أن يعمل بهذه الطريقة. على الرغم من تعيين القيمة الافتراضية عند الحفظ ، فمن المضلل تعيينها عند
find
المستند ، لأنه يجب أن يُرجع البيانات الدقيقة المخزنة في قاعدة البيانات ، أليس كذلك؟ سأصوت لإعادة فتح القضية.