_Pertama: Solusi untuk mengatasi masalah ini:_
Model.findOne({id: 'blabla'}).select('email password createdAt').lean().exec()
Saya menggunakan bidang createdAt
- yang memiliki kedaluwarsa (TTL 24h
) dan nilai default ( Date.now
) - dalam model Users
untuk menyimpan pembuatan info tanggal dari pengguna yang baru dibuat.
Jika pengguna mengaktifkan akun, sistem menghapus bidang createdAt
.
Jika pengguna tidak mengaktifkan akun, sistem akan menghapus akun dari koleksi Users
setelah 24 jam.
Dalam operasi otentikasi saya, saya memeriksa bidang createdAt
terlebih dahulu.
Jika pengguna tidak diaktifkan, saya menampilkan pesan seperti Account is not activated.
Ketika saya mencoba metode FindOne
untuk tujuan prosedur otentikasi di atas, saya mendapatkan nilai Date.now
meskipun tidak ada bidang createdAt
dalam dokumen karena pengguna telah mengaktifkan akunnya .
createdAt
bidang di saya User
Model:
createdAt: { type: Date, expires: '24h', default: Date.now },
Metode saya:
Users.findOne({email: username}, 'email, password, createdAt', function(err, user) {
Dengan menggunakan metode di atas nilai createdAt
kembali setiap saat.
ps: saya mencari masalah tetapi saya tidak bisa apa-apa.
Begitulah cara kerja default, ketika tidak ada bidang createdAt
di doc luwak akan menambahkannya. Jika Anda hanya ingin menambahkan createdAt
saat membuat dokumen baru:
schema.pre('save', function(next) {
if (this.isNew) {
this.createdAt = Date.now();
}
next();
});
Juga, saya tidak akan merekomendasikan memisahkan bidang dalam proyeksi Anda Users.findOne({email: username}, 'email, password, createdAt' /** <-- remove commas here */)
dengan koma.
Tersandung pada masalah yang sama.
@vkarpov15 seharusnya tidak bekerja seperti itu. Meskipun nilai default diatur pada penyimpanan, itu menyesatkan untuk mengaturnya ketika find
dokumen, karena itu sebenarnya mengembalikan data persis yang disimpan dalam DB, bukan? Saya akan memilih untuk membuka kembali masalah ini.
Belum tentu, luwak memiliki banyak tempat di mana dokumen tidak mewakili data persis yang disimpan di db: getter, virtual, dll. Bagaimanapun, kami menegaskan perilaku ini dan mengubahnya akan merusak banyak kode orang, jadi kami tidak akan mengubahnya kecuali ada banyak permintaan untuk mengubahnya. Berikut solusinya:
createdAt: {
type: Date,
default: function() {
if (this.isNew) { return new Date(); }
return undefined;
}
}
Ini akan membuat createdAt
hanya disetel saat menyimpan ke database, tetapi akan menjadi undefined
jika Anda memuat dokumen dari db dan createdAt
tidak mengatur.
Komentar yang paling membantu
Tersandung pada masalah yang sama.
@vkarpov15 seharusnya tidak bekerja seperti itu. Meskipun nilai default diatur pada penyimpanan, itu menyesatkan untuk mengaturnya ketika
find
dokumen, karena itu sebenarnya mengembalikan data persis yang disimpan dalam DB, bukan? Saya akan memilih untuk membuka kembali masalah ini.