2017-01-12 9 views
0

books.insertOneはtmpIdの代わりにnull値を挿入しています。両方のconsole.log(tmpId)が正しい値を表示しています。それを修正するには?Mongodb expressマニュアルリファレンス

app.post('/logged/:login/addBook/confirm', urlencodedParser, function(req,res){ 
    var login = req.params.login; 
    var id = parseInt(req.body.bId); 
    var autor = req.body.bAutor; 
    var tytul = req.body.bTytul; 
    var ksi = req.body.libId; 


    MongoClient.connect(url, function(err, db) { 
    assert.equal(null, err); 
    console.log("Nawiązano połączenie z serwerem"); 

    var books = db.collection('books'); 
    var spis = db.collection('spisBibliotek'); 
    var tmpId; 

     spis.find({"nazwa":{$eq: ksi}}).toArray(function(er1, r1){ 
      tmpId = new ObjectID(r1[0]._id); 
      console.log(tmpId); 
     }); 

      books.insertOne({id: id, autor: autor, tytul: tytul, ksiegarnia: tmpId}, function(er2,r2){ 
      console.log(tmpId); 
     }); 
    res.redirect('/logged/'+login+'/addBook'); 
    db.close(); 
    }); 
}); 

答えて

2

問題は、mongo操作が非同期であることです。あなたのbooks.insertOnespis.findが実行される前に実行されています。あなたは、コールバックを使用するか、この問題を解決することを約束したが、簡単な解決策が考えられことができます:あなたはそれを少しを再生する必要がありますので、これは擬似コードは明らかに

spis.find({query: query}, (err, records)=>{ 
    if(!err) { 
     books.insertOne(stuff) 
    } 
}) 

です。

res.sendの場合も同様です。そのリダイレクトは実際にあなたのmongo操作が完了する前に起こります。だからあなたはコールバックの中に入れたいと思う。

関連する問題