我有这个
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');
});
当我创建一些文档时,发布它们(文档在数据库中创建)并且重定向有效。所以我得到了页面,但我只在帖子之前有文件。当我刷新页面(再次获取页面)时,我已经掌握了新文档。
你有解释的想法,解决这个问题吗?
答案 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('/'),它将按预期工作