Det finns flera sätt att uppnå det du vill.
1. Använda Mongoose Queries
I den här strategin returnerar din funktion en Mongoose-fråga som du senare kan använda för att anropa metoden exec
och använd den för att få resultaten.
function getJedisQuery(name){
var query = Jedi.find({name:name});
return query;
}
Då kan du använda det helt enkelt genom att:
var query = getJedisQuery('Obi-wan');
query.exec(function(err,jedis){
if(err)
return console.log(err);
jedis.forEach(function(jedi){
console.log(jedi.name);
});
});
2. Använda Mongoose Promise-liknande objekt
Moogose ger stöd för löftesliknande föremål. Allt du behöver göra är något som liknar det jag gjorde ovan, men den här gången anropar du exec
metod utan återuppringning.
function getJedisPromise(name){
var promise = Jedi.find({name:name}).exec();
return promise;
}
Sedan kan du använda den genom att helt enkelt göra:
var promise = getJedisPromise('Luke');
promise.then(function(jedis){
jedis.forEach(function(jedi){
console.log(jedi.name);
});
})
Som framhållits i kommentarsavsnittet i det här svaret är dessa objekt i själva verket inte löften och det måste tas med i beräkningen (se Frågor är inte löften).
3. Använda Mongoose Streams
Slutligen har Mongoose också stöd för strömmar och strömmar är händelsesändare. Så du kan få en stream och sedan prenumerera på "data" och "fel" händelser. Så här:
function getjedisStream(name){
var stream = Jedi.find({name:name}).stream();
return stream;
}
Sedan kan du helt enkelt göra:
var stream = getJedisStream('Anakin');
stream.on('data', function(jedis){
jedis.forEach(function(jedi){
console.log(jedi.name);
});
});
stream.on('error', function(error){
console.log(error);
});
Källa, för framtida referens.