Der er flere måder at opnå det, du ønsker.
1. Brug af Mongoose Queries
I denne strategi returnerer din funktion en Mongoose-forespørgsel, som du senere kan bruge til at påkalde metoden exec
og brug det til at få resultaterne.
function getJedisQuery(name){
var query = Jedi.find({name:name});
return query;
}
Så kan du bruge det til at gøre:
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. Brug af Mongoose Promise-lignende objekter
Moogose giver støtte til løftelignende objekter. Alt du skal gøre er noget, der ligner det, jeg gjorde ovenfor, men denne gang påberåber du dig exec
metode uden tilbagekald.
function getJedisPromise(name){
var promise = Jedi.find({name:name}).exec();
return promise;
}
Så kan du bruge det ved blot at gøre:
var promise = getJedisPromise('Luke');
promise.then(function(jedis){
jedis.forEach(function(jedi){
console.log(jedi.name);
});
})
Som fremhævet i kommentarfeltet til dette svar, er disse objekter ikke i virkeligheden løfter, og det skal tages i betragtning (se Forespørgsler er ikke løfter).
3. Brug af Mongoose Streams
Endelig har Mongoose også understøttelse af streams og streams er begivenhedsudsender. Så du kan få en stream og derefter abonnere på 'data'- og 'fejl'-hændelser. Sådan:
function getjedisStream(name){
var stream = Jedi.find({name:name}).stream();
return stream;
}
Så kan du blot gøre:
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);
});
Kilde, til fremtidig reference.