Halo semuanya,
Saya menggunakan luwak versi 5.0.3 dan simpul versi 9.4.0. Menurut model.create dokumentasi luwak harus mengembalikan janji yang, saya asumsikan, diselesaikan saat dokumen yang dibuat disimpan di DB. Namun seperti yang ditunjukkan oleh kode di bawah ini, tampaknya janji tersebut diselesaikan sebelum dokumen disimpan di DB.
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 tidak menemukan dokumen apa pun. Selain itu "dibuat" muncul di akhir terminal, maka panggilan balik dari metode buat dieksekusi seolah-olah menunggu tidak menunggu tugas async 'membuat' selesai.
Namun dengan menambahkan janji yang diselesaikan setelah panggilan balik buat dipicu, seperti yang ditunjukkan di bawah ini, kami mendapatkan hasil yang diharapkan:
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 }
Sekarang kita mendapatkan hasil yang diharapkan.
Semua fungsi yang beroperasi pada DB mengembalikan janji yang jika diselesaikan menunjukkan bahwa operasi telah dilakukan, khususnya Query. Saya berasumsi itu juga kasus model.create meskipun tidak mengembalikan objek kueri secara tegas. Saya juga bertanya-tanya apa arti janji yang dikembalikan yang dipenuhi karena tidak menunjukkan bahwa dokumen itu dibuat di DB. Mungkin saya melewatkan intinya tetapi saya merasa agak ambigu
Saya yakin saya ingat pernah membaca di 4.x docs bahwa jika Anda meneruskan panggilan balik ke model.create itu tidak mengembalikan janji.
let x = model.create({ a: 'test' }, () => {})
x.then(console.log(x)) //TypeError: Cannot read property 'then' of undefined
jika Anda menarik panggilan balik:
let x = model.create({ a: 'test' })
x.then(console.log(x)) // Promise { <pending> }
sumber 5.x untuk model.js menanggung panggilan ini utils.promiseOrCallback
Yup, @lineus benar, bisakah saya menutup masalah ini @CodeurSauvage ?
@CodeurSauvage @lineus benar, luwak 5 tidak mengembalikan janji jika panggilan balik ditentukan. Skrip Anda berfungsi jika Anda mengganti:
await model.create({ a: 'test'},
(err,result)=> {console.log('created');});
Dengan:
await model.create({ a: 'test'}).then(result => console.log('created'));
Komentar yang paling membantu
Saya yakin saya ingat pernah membaca di 4.x docs bahwa jika Anda meneruskan panggilan balik ke model.create itu tidak mengembalikan janji.
jika Anda menarik panggilan balik:
sumber 5.x untuk model.js menanggung panggilan ini utils.promiseOrCallback