Existem várias maneiras de alcançar o que você deseja.
1. Usando consultas do Mongoose
Nesta estratégia, sua função retorna uma consulta do Mongoose que você pode usar posteriormente para invocar o método
exec
e usá-lo para obter os resultados. function getJedisQuery(name){
var query = Jedi.find({name:name});
return query;
}
Então você pode usá-lo simplesmente fazendo:
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. Usando objetos do tipo Promise do Mongoose
Moogose fornece suporte para objetos do tipo promessa. Tudo o que você precisa fazer é algo semelhante ao que fiz acima, mas desta vez, você invoca o
exec
método sem um retorno de chamada. function getJedisPromise(name){
var promise = Jedi.find({name:name}).exec();
return promise;
}
Então você pode usá-lo simplesmente fazendo:
var promise = getJedisPromise('Luke');
promise.then(function(jedis){
jedis.forEach(function(jedi){
console.log(jedi.name);
});
})
Conforme destacado na seção de comentários desta resposta, esses objetos não são de fato promessas e isso precisa ser levado em consideração (consulte Consultas não são promessas).
3. Usando fluxos de mangusto
Por fim, o Mongoose também tem suporte para streams e streams são emissores de eventos. Assim, você pode obter um fluxo e, em seguida, se inscrever para eventos de 'dados' e 'erro'. Assim:
function getjedisStream(name){
var stream = Jedi.find({name:name}).stream();
return stream;
}
Então você pode simplesmente fazer:
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);
});
Fonte, para referência futura.