为何无法通过`user.roles = {...}`为Sequelize模型实例添加属性并在JSON序列化中显示?
问题原因及解决方案
这是因为Sequelize的模型实例并非普通JavaScript对象——它内部用dataValues对象来存储从数据库获取的字段数据。当你调用JSON.stringify()时,Sequelize实例会自动触发内置的toJSON()方法,而这个方法默认只会序列化dataValues里的内容。你直接给user实例赋值的roles属性是挂载在实例本身,而非dataValues中,所以自然不会出现在序列化结果里。
至于user.roles = {...}这个赋值本身是有效的,你在代码里可以正常访问到这个属性,但它不会被自动纳入JSON序列化的输出范围。
几种可行的解决办法
直接修改
dataValues对象
把自定义属性添加到实例的dataValues中,这样序列化时就会被包含:user.dataValues.roles = {"Traveler": true};重写
toJSON()方法
如果需要所有User实例都能自动携带自定义属性,可以在模型定义时扩展toJSON()方法(以下是Sequelize V4+的推荐写法):User.prototype.toJSON = function() { // 先获取实例的基础数据对象 const baseData = Object.assign({}, this.get()); // 合并自定义属性 baseData.roles = this.roles; return baseData; };这样之后,任何User实例调用
JSON.stringify()时,都会自动包含你添加的roles属性。手动合并对象后序列化
要是只是临时需求,可以手动把实例数据和自定义属性合并成普通对象再序列化:const serializedUser = Object.assign({}, user.get(), { roles: {"Traveler": true} }); console.log(JSON.stringify(serializedUser));这里的
user.get()会返回包含所有数据库字段的普通JS对象,和自定义属性合并后就能正常序列化了。
内容的提问来源于stack exchange,提问作者Marty
相关产品推荐
相关产品推荐

