在刷新页面之前,Mongoose找不到最后创建的条目

时间:2017-10-28 23:00:55

标签: node.js express mongoose

我有这个

router.get('/documents', function(req, res, next) {
  Document.find(function(err, doc){
    res.render('documents', { doc: doc });
  });
});

router.post('/documents', function(req, res, next) {
  // Create function
  req.body.newdocs.forEach(function(newdoc) {
    Document.create({title : newdoc.title, desc: newdoc.desc}, function (err, ndoc) {
      if (err) {
        res.flash('error', "Error. Try again.");
        res.redirect('/documents');
      }
    });
  });      

  // Update function
  req.body.docs.forEach(function(doc) {
    var d = {
      title: doc.title,
      desc: doc.desc
    }
    Document.update({'_id': doc.id}, d, {overwrite: true}, function(err, raw) {
      if (err) return handleError(err);
    });
  });
  res.redirect('/documents');
});

当我创建一些文档时,发布它们(文档在数据库中创建)并且重定向有效。所以我得到了页面,但我只在帖子之前有文件。当我刷新页面(再次获取页面)时,我已经掌握了新文档。

你有解释的想法,解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

您的代码中的问题是您不等待更新功能完成。 :) 您告诉数据库使用以下命令保存文档:

Document.update({'_id': doc.id}, d, {overwrite: true}...

但mongo会更新异步,这意味着此代码只会查询并继续,而无需等待实际更新。为了使您的代码正确,您需要在回调中运行res.redirect('/documents');(这是在实际更新完成后执行的函数)。 所以你的代码应该是这样的:

Document.update({'_id': doc.id}, d, {overwrite: true}, function(err, raw) {
   if (err) return handleError(err);
   res.redirect('/documents');
});

Promise.all示例,根据@XavierB的要求

//Push all of the promises into one array
let promises = [];
promises.push(Document.update({'_id': doc.id}, d, {overwrite: true}));
//Await for all of the promises to be done
Promises.all(promises).then(function(){
    //All of the promises were resolved
    res.redirect('/documents');
}).catch(err => { 
    //Something went terribly wrong with ANY of the promises.
    console.log(err); 
});;

答案 1 :(得分:0)

它是异步的,需要一段时间才能完成。您应该使用async await或.then在回调中运行res.redirect('/'),它将按预期工作