Restituisce i risultati mangusta nella query di ricerca a una variabile
-
21-12-2019 - |
Domanda
Devo restituire i risultati di una query con mongoose in node.js.
Come si restituisce il valore per impostare il valore su una variabile?
Quello che devo fare è:
var results = users.findOne({_id : users_list[i]['user_id']},{email : 1, credits : 1},{}, function(err, docs) {
if( err || !docs) {
console.log("No user found");
} else {
return docs;
};
});
In modo da avere:
results = docs
Grazie mille per la tua risposta.
Ho anche un altro problema.
Come passare la variabile in un operatore di query con find o findOne?Come :
var foo = "Blaa";
users.findOne({_id : users_list[i]['user_id']},{email : 1, credits : 1},{}, function(err, docs) {
if( err || !docs) {
console.log("No user found");
} else {
// I want to use the foo variable here
console.log(foo);
};
});
Soluzione
Esistono diversi modi per ottenere ciò che desideri.
1.Utilizzo delle query Mongoose
In questa strategia, la tua funzione restituisce una query Mongoose che puoi utilizzare in seguito per invocare il metodo exec
e usarlo per ottenere i risultati.
function getJedisQuery(name){
var query = Jedi.find({name:name});
return query;
}
Quindi puoi usarlo semplicemente facendo:
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.Utilizzo di oggetti simili a Mongoose Promise
Moogose fornisce supporto per oggetti simili a promesse.Tutto quello che devi fare è qualcosa di simile a quello che ho fatto sopra, ma questa volta invochi il file exec
metodo senza callback.
function getJedisPromise(name){
var promise = Jedi.find({name:name}).exec();
return promise;
}
Quindi puoi usarlo semplicemente facendo:
var promise = getJedisPromise('Luke');
promise.then(function(jedis){
jedis.forEach(function(jedi){
console.log(jedi.name);
});
})
Come evidenziato nella sezione commenti di questa risposta, questi oggetti non sono in realtà promesse e ciò deve essere preso in considerazione (vedi Le domande non sono promesse).
3.Utilizzo dei flussi di mangusta
Infine, Mongoose ha anche il supporto per i flussi e i flussi sono emettitori di eventi.Quindi, potresti ottenere uno streaming e quindi iscriverti per eventi "dati" ed "errore".Come questo:
function getjedisStream(name){
var stream = Jedi.find({name:name}).stream();
return stream;
}
Quindi puoi semplicemente fare:
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, per riferimento futuro.
Altri suggerimenti
viene eseguito prima dell'assegnazione.
async function(req, res) {
var user;
await users.findOne({}, function(err,pro){
user=pro;
});
console.log(user); \\ it's define
};
. ottieni il risultato desiderato dal seguente codice.Spero che questo ti aiuterà molto ..
var async = require('async');
// custom imports
var User = require('../models/user');
var Article = require('../models/article');
var List1Objects = User.find({});
var List2Objects = Article.find({});
var resourcesStack = {
usersList: List1Objects.exec.bind(List1Objects),
articlesList: List2Objects.exec.bind(List2Objects),
};
async.parallel(resourcesStack, function (error, resultSet){
if (error) {
res.status(500).send(error);
return;
}
res.render('home', resultSet);
});
. Puoi facilmente raggiungere questo problema.
const getUser = async ( req, res ) => {
let users = () => ( User.find({_id : users_list[i]['user_id']},{email : 1, credits : 1}).exec() );
try { res.send({"user":await users() });}
catch(e) { console.log(e) }
}
app.get('/user' , getUser);
.