You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 13:36:01