确保Mongoose Save在回调之前完成

时间:2015-12-10 08:08:06

标签: node.js mongodb redirect mongoose synchronous

我在编写我的第一个节点应用程序时遇到了问题,我的回调被调用,然后才真正完成对数据库的写入。

方案是,当经过身份验证的用户转到url site.com/model时,将查询数据库以查看是否存在属于该用户的模型。如果有,则显示给用户。如果没有,则用户被重定向到具有可以提交的表单的site.com/model/create。提交该表单后,模型将保存到数据库,用户将重定向到site.com/model,在那里显示新创建的对象。问题是,在下面的代码中,保存回调中的重定向发生在写入完成之前。这意味着在提交新模型后将用户重定向到site.com/model时,新模型尚未写入,这意味着它们会再次重定向回site.com/model/create,但是如果我等待并刷新页面,模型已创建。知道如何在重定向之前确保写入完成吗?对不起,如果我的问题不明确,我很乐意回答问题以便清理。

router.get('/model', isLoggedIn, function(req, res) {
    Model.findOne({'owner': req.user.username}, function(err, card) {
        if(err) {

        }

        if(model) {
            res.render('model', {
                user : req.user,
                model : model
            });
        } 
        else {
            res.redirect('/model/create');
        }
    });
});
router.get('/model/create', isLoggedIn, function(req, res) {
    Model.findOne({'owner': req.user.username}, function(err, card) {
        if(err) {

        }

        if(model) {
            res.redirect('/model');
        } 
        else {  
            res.render('model/create', {
                user : req.user
            });
        }
    });
});

router.post('/model/create', isLoggedIn, function(req, res) {
    req.body.model.save(function(err) {
        if(err) {
            throw err;
        }

        res.redirect('/model');
    });
});

1 个答案:

答案 0 :(得分:0)

req.body.model很可能是客户端发送的表单数据(转换为JSON)。我不确定它是如何在您的代码中调用.save方法的。

通常您应该使用此数据创建新的模型实例并保存:

new Model(req.body.model).save(...)