Node.js Mongodb express手册参考

Node.js Mongodb express手册参考,node.js,mongodb,express,Node.js,Mongodb,Express,books.insertOne正在插入null值,而不是tmpId。两个console.log(tmpId)都显示正确的值。如何修复它 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

books.insertOne正在插入null值,而不是tmpId。两个console.log(tmpId)都显示正确的值。如何修复它

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

您的问题是mongo操作是异步的。因此,您的
books.insertOne
是在
spis.find
完成之前执行的。您可以使用回调或承诺来解决此问题,但一个简单的解决方案可以是:

spis.find({query: query}, (err, records)=>{
    if(!err) {
        books.insertOne(stuff)
    }
})
这显然是伪代码,所以您必须稍微使用它


同样,这也适用于
res.send
。这种重定向实际上会在mongo操作完成之前发生。因此,您希望将其放入回调中。

您的问题是mongo操作是异步的。因此,您的
books.insertOne
是在
spis.find
完成之前执行的。您可以使用回调或承诺来解决此问题,但一个简单的解决方案可以是:

spis.find({query: query}, (err, records)=>{
    if(!err) {
        books.insertOne(stuff)
    }
})
这显然是伪代码,所以您必须稍微使用它

同样,这也适用于
res.send
。这种重定向实际上会在mongo操作完成之前发生。所以你想把它放在一个回调中