我在为我的模型连续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的东西?
答案 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。