Mongoose: Model.create Janji diselesaikan meskipun tidak ada dokumen yang disimpan

Dibuat pada 1 Feb 2018  ·  3Komentar  ·  Sumber: Automattic/mongoose

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

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.

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

Semua 3 komentar

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'));
Apakah halaman ini membantu?
0 / 5 - 0 peringkat