我已经有了另一个解决方案,但不明白为什么我的不起作用。我尝试在这里使用 $set: 但它没有帮助。当我打印时,objForUpdate 确实返回“姓名,姓氏”。如果我用 {name, lastname} 替换 {objForUpdate} - 更新有效。但我不能在变量中传递参数。//Route to UPDATE user async updateUser(req, res) { let { _id, type, name, lastname } = req.body; try { let objForUpdate = ""; for (var key in req.body) { if (req.body.hasOwnProperty(key) && req.body.key !== null && req.body[key] !== "" && key !== '_id') { console.log("this is key: " + key + ", and this is value req.body[key]: " + req.body[key]); objForUpdate += key + ", "; } } objForUpdate = objForUpdate.slice(0, -2); const updated = await Users.updateOne({ _id }, {objForUpdate}); res.send({ updated }); } catch (error) { res.send({ error }); } }
1 回答
ITMISS
TA贡献1871条经验 获得超8个赞
如果你要调试代码,你会得到它。
假设req.body
看起来像{ name: "foo", lastname: "bar" type: "2", _id: 1}
,并且在 for 循环和切片操作的末尾objForUpdate
将"name, lastname, type"
是一个string。
现在,当您将此字符串传递给 updateOne 操作时,这部分{objForUpdate}
将被转换为{ objForUpdate: "name, lastname, type" }
(标识符作为键的转换,其定义的值作为该键的值)。
即使使用$set
运算符,该更新对象也是不正确的。
如果我用 {name, lastname} 替换 {objForUpdate} - 更新有效。为什么?
因为在这种情况下使用对象解构,您将对象解压缩为带有值的独立变量(名称,姓氏...)。在这种情况下{objForUpdate}
,传递的时间将成为{"name":"foo", "lastname":"bar", "type":"2"}
正确的更新对象。
添加回答
举报
0/150
提交
取消