Saya menemukan sepotong kode Mongoose yang menyertakan query findOne dan kemudian fungsi exec ().
Saya belum pernah melihat metode itu di Javascript sebelumnya? Apa tepatnya yang dilakukannya?
Saya menemukan sepotong kode Mongoose yang menyertakan query findOne dan kemudian fungsi exec ().
Saya belum pernah melihat metode itu di Javascript sebelumnya? Apa tepatnya yang dilakukannya?
Jawaban:
Pada dasarnya saat menggunakan luwak, dokumen dapat diambil dengan bantuan pembantu. Setiap metode model yang menerima kondisi query dapat dieksekusi dengan cara callback
atau exec
metode.
callback
:
User.findOne({ name: 'daniel' }, function (err, user) {
//
});
exec
:
User
.findOne({ name: 'daniel' })
.exec(function (err, user) {
//
});
Oleh karena itu, jika Anda tidak meneruskan callback, Anda dapat membuat kueri dan akhirnya menjalankannya.
Anda dapat menemukan info tambahan di dokumen luwak .
MEMPERBARUI
Sesuatu yang perlu diperhatikan saat menggunakan Promises dalam kombinasi dengan operasi asinkron Mongoose adalah kueri Mongoose bukanlah Promises. Queries mengembalikan thenable , tetapi jika Anda membutuhkan Promise yang nyata, Anda harus menggunakan exec
metode ini. Informasi lebih lanjut dapat ditemukan di sini .
Selama pembaruan, saya perhatikan saya tidak secara eksplisit menjawab pertanyaan:
Saya belum pernah melihat metode itu di Javascript sebelumnya? Apa tepatnya yang dilakukannya?
Ini bukan metode JavaScript asli, tetapi bagian dari API Mongoose.
exec
metode ini. Ini yang setidaknya mereka lakukan di dokumen. Yang pasti Anda bisa memeriksanya sendiri dengan Model.find() instanceof require('bluebird')
. Semoga ini membantu.
Model.update().exec()
memastikan itu akan dijalankan. Kemudian Anda dapat merespons api tanpa menunggu pembaruan.
Daniel menjawab ini dengan cukup indah. Untuk menguraikan daftar lengkap cara membuat dan mengeksekusi kueri, lihat kasus penggunaan berikut:
Pembuatan Kueri
Mongoose tidak akan mengeksekusi query sampai then
atau exec
telah dipanggil. Ini sangat berguna saat membuat kueri yang kompleks. Beberapa contoh dapat mencakup penggunaan populate
dan aggregate
fungsi.
User.find({name: 'John'}) // Will not execute
Eksekusi melalui panggilan balik
Meskipun tidak disukai oleh banyak orang karena sifatnya yang bersarang, kueri dapat dijalankan dengan menyediakan callback opsional.
User.find({name: 'John'}, (err, res) => {}) // Will execute
Kemudian API sebagai Promises / A +
Kueri Mongoose memang menyediakan then
fungsi. Jangan disamakan dengan janji biasa. Sederhananya, spesifikasi Promises / A + membutuhkan then
fungsi agar berfungsi seperti yang biasa kita lakukan dengan promise.
User.find({name: 'John'}).then(); // Will execute
Promise.all([User.find({name: 'John'}), User.find({name: 'Bob'})]) // Will execute all queries in parallel
Fungsi exec
Dari dokumen Mongoose If you need a fully-fledged promise, use the .exec() function.
User.find({name: 'John'}).exec(); // Will execute returning a promise
then
kueri untuk mengembalikan janji juga. Ini tidak jauh berbeda dengan exec
. Kasus penggunaan yang menurut saya berguna ini adalah saat menggunakan sesuatu seperti Promise.all
. Tidak yakin apakah janji dikembalikan oleh exec
karya dalam konteks seperti itu.
exec()
akan mengembalikan janji jika tidak ada panggilan balik yang diberikan. Jadi, pola berikut sangat nyaman dan umum - ini dapat menangani callback atau promise dengan baik:
function findAll(query, populate, cb) {
let q = Response.find(query);
if (populate && populate.length > 0) {
q = q.populate(populate);
}
// cb is optional, will return promise if cb == null
return q.lean().exec(cb);
}
Saya merekomendasikan menggunakan janji Bluebird dengan Mongoose, untuk melakukan itu, gunakan panggilan ini:
const mongoose = require('mongoose');
mongoose.Promise = require('bluebird');