如何在NestJS中序列化Prisma对象并排除指定字段?
Prisma 排除返回字段的常用解决方案
方案1:查询时直接通过Prisma原生配置过滤
这是性能最优的原生方案,从查询层面就过滤不需要的字段,不会从数据库读取冗余数据。
- 若需要的字段更少,用
select声明要返回的字段:
const user = await prisma.user.findUnique({ where: { id: 1 }, select: { id: true, name: true, email: true // 不需要的password、createdAt等字段不声明就不会返回 } })
- 若需要排除的字段更少,Prisma 4.16.0及以上版本支持直接用
omit配置要排除的字段:
const user = await prisma.user.findUnique({ where: { id: 1 }, omit: { password: true, createdAt: true } })
方案2:封装通用工具函数剔除已有对象的字段
如果已经拿到了完整的Prisma返回对象,可以封装无依赖的工具函数处理,不需要引入Class Transformer:
function excludeFields<T, Key extends keyof T>( originObj: T, excludeKeys: Key[] ): Omit<T, Key> { return Object.fromEntries( Object.entries(originObj).filter(([key]) => !excludeKeys.includes(key as Key)) ) as Omit<T, Key> } // 使用示例 const rawUser = await prisma.user.findUnique({ where: { id: 1 } }) const safeUser = excludeFields(rawUser, ['password', 'createdAt'])
方案3:兼容Class Transformer的用法
如果一定要用Class Transformer的装饰器能力,可以先定义DTO类,将Prisma返回的普通对象转为DTO实例后再序列化:
import { Exclude, plainToInstance } from 'class-transformer' class UserResponseDTO { id: number name: string email: string @Exclude() password: string @Exclude() createdAt: Date } // 使用示例 const rawUser = await prisma.user.findUnique({ where: { id: 1 } }) const safeUser = plainToInstance(UserResponseDTO, rawUser)
内容的提问来源于stack exchange,提问作者rony
相关产品推荐
相关产品推荐

