2016-09-09 1 views
-1

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.

+0

Obtenez-vous cette valeur après boucle? – abdulbarik

+2

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

+0

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

Répondre

2

pourquoi ne pas utiliser mongoose pour modéliser vos affaires. c'est plus intuitif et vous n'avez pas besoin de déclarer l'objet global et faire le mapping dans la boucle for que vous faites.

également votre approche est un peu faux en termes de quand vous parcourez pour ne pas vous écraser? disons que vous avez deux documents où pusername est abdul. donc dans votre cas vous perdez le premier objet qui sera écrasé par le second.

Je vois que vous avez commenté une déclaration de retour, mais même cela ne fonctionnera pas correctement.

D'un point de vue conceptuel, votre approche n'est pas efficace.

à mangouste que vous pouvez faire:

{ 

    var userProjectSchema = new mongoose.Schema({ 
     createdBy: { type: String } 
    , proName: String 
    , proType: String 
    , proDesc: String 
    }); 


// Find a single document by username. 
userProjectSchema.findOne({ pusername : 'abdul' }, function(err, resDoc) { 
    if (err) return console.error(err); 
    // do your html stuff here 
}); 

// Find all documents. 
userProjectSchema.find(function(err, results) { 
    if (err) return console.error(err); 
    // do your html stuff here 
}); 


    }