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 callbackveya execyö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 , execyö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ı.
execyö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 thenveya execbunun üzerine adı olmuştur. Bu, karmaşık sorgular oluştururken çok kullanışlıdır. Bazı örnekler, populateve aggregateiş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 thenişlev sağlar. Bu, düzenli sözlerle karıştırılmamalıdır. Basitçe söylemek gerekirse, Promises / A + spesifikasyonu, thensö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
thenbir 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. execYine 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');