FindOne sorgusu ve ardından exec () işlevi içeren bir Mongoose kod parçasıyla karşılaştım.
Bu yöntemi daha önce Javascript'te görmedim mi? Tam olarak ne yapar?
FindOne sorgusu ve ardından exec () işlevi içeren bir Mongoose kod parçasıyla karşılaştım.
Bu yöntemi daha önce Javascript'te görmedim mi? Tam olarak ne yapar?
Yanıtlar:
Temel olarak firavun faresi kullanılırken, belgeler yardımcılar kullanılarak alınabilir. Sorgu koşullarını kabul eden her model yöntemi, a callback
veya exec
yöntemiyle çalıştırılabilir.
callback
:
User.findOne({ name: 'daniel' }, function (err, user) {
//
});
exec
:
User
.findOne({ name: 'daniel' })
.exec(function (err, user) {
//
});
Bu nedenle, bir geri aramayı iletmediğinizde, bir sorgu oluşturabilir ve sonunda onu çalıştırabilirsiniz.
Daha fazla bilgiyi firavun faresi belgelerinde bulabilirsiniz .
GÜNCELLEME
Promises'i Mongoose async işlemleriyle birlikte kullanırken dikkat edilmesi gereken bir nokta, Mongoose sorgularının Promises olmadığıdır . Sorgular bir anahtar döndürür , ancak gerçek bir Söze ihtiyacınız varsa , exec
yöntemi kullanmalısınız . Daha fazla bilgiyi burada bulabilirsiniz .
Güncelleme sırasında soruyu açıkça cevaplamadığımı fark ettim:
Bu yöntemi daha önce Javascript'te görmedim mi? Tam olarak ne yapar?
Eh öyle değil bir yerli JavaScript yöntemi, ancak Gelincik API parçası.
exec
yöntemi aramanız gerektiğine inanıyorum . En azından belgelerde yaptıkları bu. Kendinizi kontrol edebileceğinizden emin olmak için Model.find() instanceof require('bluebird')
. Bu yardımcı olur umarım.
Model.update().exec()
emin çalıştırır yapmak. Ardından, güncelleme beklemeden api'ye yanıt verebilirsiniz.
Daniel bunu çok güzel cevapladı. Sorgu oluşturma ve yürütme yollarının kapsamlı bir listesini geliştirmek için aşağıdaki kullanım durumlarına bakın:
Sorgu Oluşturma
Gelincik kadar bir sorgu yürütmez then
veya exec
bunun üzerine adı olmuştur. Bu, karmaşık sorgular oluştururken çok kullanışlıdır. Bazı örnekler, populate
ve aggregate
işlevlerinin kullanımını içerebilir .
User.find({name: 'John'}) // Will not execute
Geri arama yoluyla yürütme
İç içe geçmiş doğası nedeniyle birçok kişi tarafından beğenilmese de, sorgular isteğe bağlı geri arama sağlanarak yürütülebilir.
User.find({name: 'John'}, (err, res) => {}) // Will execute
Sonra bir Söz / A + olarak API
Mongoose sorguları bir then
işlev sağlar. Bu, düzenli sözlerle karıştırılmamalıdır. Basitçe söylemek gerekirse, Promises / A + spesifikasyonu, then
sözlere alışkın olduğumuz gibi çalışması için bir işlev gerektirir .
User.find({name: 'John'}).then(); // Will execute
Promise.all([User.find({name: 'John'}), User.find({name: 'Bob'})]) // Will execute all queries in parallel
Exec işlevi
Mongoose belgelerinden If you need a fully-fledged promise, use the .exec() function.
User.find({name: 'John'}).exec(); // Will execute returning a promise
then
bir söz vermek için sorguda da kullanabilirsiniz . Bu çok farklı değil exec
. Bunu kullanışlı bulduğum kullanım durumu, gibi bir şey kullanırken Promise.all
. exec
Yine de bu tür bağlamlarda işe yarayıp yaramadığından emin değilim .
exec()
geri arama sağlanmazsa söz verir. Bu nedenle, aşağıdaki model çok kullanışlı ve geneldir - geri aramaları veya vaatleri güzel bir şekilde işleyebilir:
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);
}
Bluebird vaatlerini Mongoose ile kullanmanızı tavsiye ederim, bunu yapmak için bu aramayı kullanın:
const mongoose = require('mongoose');
mongoose.Promise = require('bluebird');