books.insertOne正在插入空值而不是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();
});
});
答案 0 :(得分:2)
你的问题是mongo操作是异步的。因此,在books.insertOne
完成之前,您的spis.find
正在执行。您可以使用回调或承诺来解决此问题,但一个简单的解决方案可能是:
spis.find({query: query}, (err, records)=>{
if(!err) {
books.insertOne(stuff)
}
})
这显然是伪代码所以你必须稍微玩一下。
此外,res.send
之类的内容也是如此。该重定向实际上将在您的mongo操作完成之前发生。所以你想把它放在一个回调中。