2016-09-09 5 views
-1

MongoDBコレクションからデータを取得し、グローバルオブジェクトに保存しようとしています。後でHTMLテンプレートを解析する必要があります。MongoDBからデータを取得し、Node.jsおよびExpress.jsのグローバルオブジェクトに保存します

ユーザログが自分のプロフィールに

: はここに私のコードですし、我々は彼のプロジェクトを取得する必要があり、ここで我々は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}); 
    }); 

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); 
}); 

};

私は次のように先頭にグローバルオブジェクトを宣言している:

userProjects = { 
createdBy:'', 
proName:'', 
proType:'', 
proDesc:'' 
}; 

しかし、私はfindeprojects()関数を呼び出した後use​​rprojectsオブジェクトを慰めるときには、空の値を表示します。

+0

あなたはループの後にこの値を取得していますか? – abdulbarik

+2

残念なことに、Nodeの非同期性の性質をどのように扱うか分からず、グローバル(問題の解決策ではない)を使用して回避しようとしているようです。私はあなたが何かよりはるかに単純なもの(あなたが投稿しているコードの中にたくさんの動いている部分があります)を使い始めると、非同期関数を扱う方法に関する良いチュートリアルを読んだ方が簡単だろうと思います。 – robertklep

+0

あなたのデータを見たい場合は、 'toArray'メソッドで' console.log'ステートメントをコールバック関数の側で動かすことができます。しかし、私も@rokeryklepに同意します。 – Mike

答えて

2

なぜあなたはあなたのものをモデル化するためにmongooseを使用しませんか? より直観的で、グローバルオブジェクトを宣言し、実行しているforループでマッピングを行う必要はありません。

また、あなたのアプローチは、あなたが上書きしていないときには少し間違っていますか? pusernameがabdulの2つの文書があるとします。 あなたのケースでは、2番目のオブジェクトによって上書きされる最初のオブジェクトが緩くなります。

あなたは返信文をコメントアウトしていますが、それでも正しく動作しません。

デザインの観点からは、あなたのアプローチは効率的ではありません。あなたはマングースで

を行うことができます。

{ 

    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 
}); 


    } 
関連する問題