J'essaie d'obtenir des données de la collection MongoDB et de les enregistrer dans un objet global. Plus tard, j'ai besoin de l'analyser en HTML template. Voici mon code:Récupérer des données de MongoDB et les enregistrer dans un objet global dans Node.js et Express.js
Lorsque la connexion de l'utilisateur sur son profil: alors nous avons besoin de ses projets et ici nous appelons la fonction findeprojects()
usrRouter.route('/profile')
.all(function (req,res,next) {
if(!req.user){
res.redirect('/');
}
next();
})
.get(function (req,res,userObj) {
// var proj = findprojects();
userObj = req.user;
var pro = {};
pro = findprojects(userObj);
res.render('index',{name:userObj.username, email:userObj.email});
//res.sendFile('profile.html',{root:path.join(__dirname,'../public'),},{name:userObj.username});
});
Voici le code de la fonction findeprojects:
var findprojects = function(obj) {
var usern = obj.username;
mongodb.connect(url,function(err, db){
if(err) throw err;
var collection = db.collection('projects');
//console.log(usern);
collection.find({'pusername':usern});
cursor =db.collection('projects').find({ 'pusername': usern }).toArray(function(err,items){
//console.log(items);
var i;
for(i=0; i<items.length;){
userProjects.createdBy = items[i].pusername;
userProjects.proName = items[i].projectName;
userProjects.proType = items[i].projectType;
userProjects.proDesc = items[i].projectDesc;
//return userProjects;
i = i+1;
}
});
console.log(userProjects);
});
};
J'ai déclaré objet global au sommet comme:
userProjects = {
createdBy:'',
proName:'',
proType:'',
proDesc:''
};
Mais quand je console userprojects objet après avoir appelé la fonction findeprojects() affiche des valeurs vides.
Obtenez-vous cette valeur après boucle? – abdulbarik
Pour être brutalement honnête: il semble que vous ne sachiez pas comment travailler avec la nature asynchrone de Node, et que vous essayez de contourner ce problème en utilisant des globals (qui ne sont pas la solution à votre problème). Je pense que ce serait plus simple si vous commenciez avec quelque chose de beaucoup plus simple (il y a beaucoup de parties mobiles dans le code que vous publiez), et lisez un bon tutoriel sur la façon de gérer les fonctions asynchrones. – robertklep
Si vous voulez simplement voir vos données, vous pouvez déplacer l'instruction 'console.log' à côté de la fonction de rappel dans votre méthode' toArray'. Mais je suis aussi d'accord avec @rokeryklep. – Mike