我从前端接收一个数据对象,如下所示:
module.exports.myModule = async (req, res) => {
let data = req.body.data
}
例如,该对象包含以下属性和值:
name : Michel,
age: 56,
city: Paris,
如果我想更新我的表,我可以这样做:
myTable.update(data);
但是,如果其中一个属性为空,则数据库中相应的值将变为空。
是否有一种方法可以仅在提供值时更新行,而在不提供值时保留旧值?
3条答案
按热度按时间kiayqfof1#
它仅在保存到数据库之前验证数据,请使用“选项:在数据的“保存”中使用的“对象”。查看更多信息这里:https://sequelize.org/api/v6/class/src/model.js~model#instance-method-save
disho6za2#
试试这个:
现在只有在正文中输入的值将被更新
ubof19bj3#
我不得不承认,我有一个合理的困难时期试图复制这一点。一旦我可以,我不得不做一些假设,我希望是正确的。
所作的假设:
Content-Type: application/json
)express.json()
将接收到的data
卸载到req.body
。express.json()
不会让你逃脱任何undefined
值(Unexpected token 'u'...
),如果你不发送属性,Sequelize不会更新它(例如:name : Michel
只更新name
列,而name : Michel, age: 56
只更新这两个列)...null
的属性(在这种情况下,我会认真考虑一些额外的前端先前验证,但我明白这可能不是你可以控制的smth)allowNull: false
),这基本上会触发违反约束的错误。好吧,假设这些假设是正确的,Sequelize可以很容易地避免麻烦。:)
请在文档中简要查看一下。
API References
并选择有问题的版本(现在稳定是v6),然后在左边的菜单上选择你关心的类/接口/事项。在我们的例子中,我们处理的是模型,所以只需点击模型,它的所有方法都会出现。这只是为了防止您或其他任何人有兴趣学习导航它们,因为它可能是恐吓在第一。在我们的例子中,我们关注的是
options.fields
,它应该是一个数组,这里的键是:* 它默认为所有字段。这意味着如果你在这里指定只想更新一个或两个字段,不管他们给你发送什么样的奇怪对象,只有那些字段会被更新。(不要担心接收到任何其他无效属性,因为Sequelize足够智能,只会将值更新为有效的列名。
这意味着现在,你只需要用
data
对象中实际接收到的键填充一个数组。幸福之路的版本应该是:
然后你就可以走了但实际上这是1)不必要的,因为Sequelize将确保只更新提供的属性,2)并没有解决我们的问题,就像我们收到一个
null
值,它的键仍然会传递给options.fields
。此外,由于body-parser
的工作方式,null
将作为'null'
字符串传递。因此,我们只需要传递那些不是
'null'
的。毫无疑问,有不同的方法来做到这一点。只是其中之一:所以,或多或少,这就是它看起来的样子:
data
对象可能发送给您空值,您可能需要进行一些额外的先前验证以查看它是否为空,如果是这样,则根本不执行更新。希望能帮上忙。另外,如果我有任何误解,请随时指出它,因为它会帮助我学习。