在使用Node.js进行服务端开发时我们通常使用Sequelize作为ORM框架,同时使用TypeScript作为开发语言。在我们查询数据时,通常需要根据前端的参数来动态处理一些数据库查询出来的数据,这些处理无法通过模型中的get进行,只可以在路由函数中进行处理。
很多开发者会选择直接遍历查询的rows进行属性的添加,但是如果使用了TypeScript会报错。这里举个例子。
那我们应该怎么处理呢?可以在map中使用dataValues,直接修改dataValues的值来达到修改数据,但是这样不够灵活,并且使用TS进行开发时有报错。我没有在模型中定义user_id但是我添加了一个,使用dataValues是可以的,但是有类型报错(应该是我TS版本的问题,各位同学可以尝试一下,把结果告诉我),使用forEach也可以,我这里只是一个Demo
同时我们也可以使用JSON.parse(JSON.stringify)深拷贝,这里不过多赘述。
Sequelize提供了几个方法:
模型中单个属性有个toJSON的方法,可以获取到get函数处理后未被Sequelize加工的对象。
代码语言:javascript复制 function getTypeTree() {
return rows.map(item => {
let _item = item.toJSON();
return !_item.belong
? Object.assign({ children: rows.filter(_item => _item.belong == item.id) }, item.toJSON())
: false;
}).filter(item=>item);
}
同时还要另一种使用get()
代码语言:javascript复制 function getTypeTree() {
return rows
.map(item => {
let _item = item.get({ plain: true });
return !_item.belong
? Object.assign(
{ children: rows.filter(_item => _item.belong == item.id) },
item.toJSON()
)
: false;
})
.filter(item => item);
}
和toJSON一样使用,,对于他们的区别和用法,这是我在其他网站查询到的;
toJSON:将当前实例转换为JSON形式,意味着会从数据库中取值,并应用所有自定义的访问器。