制作2,背靠背,连​​续更新到mongo

时间:2016-11-16 04:13:04

标签: node.js mongodb mongoose

我在为我的模型连续2次更新时遇到了一些麻烦。这是我的小型通用更新处理程序:

let updateHandler = function(prop, data, req, res, done) {
    Ingredient.update({ name: req.body.ingredientName }, {
        [prop]: data
    }, function(err, raw) {
        if (err) {
            console.log(err);
            res.send('/error');
        } else {
            console.log(raw);
            if(done) res.send('/ingredients');
        }
    })
}

这些是我的电话:

updateHandler('name', req.body.ingredientNewName, req, res, false);
updateHandler('price', parseFloat(req.body.ingredientNewPrice), req, res, true); 

我知道updateHandler有点奇怪,你可能会问自己:"为什么你会这样做?"但是这不是这个问题的重点。我想知道为什么这不起作用。

当我执行两个更新时,只有第一个更新实际修改了模型。我得到了回复:

{ ok: 1, nModified: 1, n: 1 } 
{ ok: 1, nModified: 0, n: 0 }

所以我知道这两个更新都发生了,但第二个1没有修改任何东西。甚至更奇怪的是,如果在第一次更新时没有进行任何修改,第二次更新将起作用并进行修改:

{ ok: 1, nModified: 0, n: 1 }
{ ok: 1, nModified: 1, n: 1 }

我真的很想了解这里发生了什么。我有一种感觉,这可能是一个异步问题,在这种情况下,也许我可以通过承诺解决这个问题。但是更新实际上正在执行,所以也许有mongo / mongoose的东西?

1 个答案:

答案 0 :(得分:0)

难道不是很明显吗?

您根据name: req.body.ingredientName拨打的第一个电话,以及您在第一次拨打电话时将姓名更改为req.body.ingredientNewName

一切都很好,

现在再次拨打第二个电话name: req.body.ingredientName,但它找不到任何内容,因为您的第一个查询已将名称更改为req.body.ingredientNewName,因此它无法找到没有改变任何事情。

您确实需要一个更好的结构,并且可能会通过该函数传递查询{ name: req.body.ingredientName },并在您第一次传递{name:req.body.ingredientName}时,下次传递{name:req.body.req。 body.ingredientNewName}

那将是快速解决方案imo。