当前位置: 首页 > news >正文

【NestJS】class-transformer什么用

🧩 一句话总结

class-validator 负责校验数据,class-transformer 负责把数据“变形”。
前者管“对不对”,后者管“长什么样”。


🚀 1. 它的主要功能

(1)请求数据的反序列化(plain → class)

在进入控制器之前,Nest 的 ValidationPipe 会:

  1. 先用 class-transformerplain object(比如前端传来的 JSON)转换为指定的 DTO 类实例
  2. 然后再交给 class-validator 去校验。

💡 举例来说:
前端传来 { age: '18' }
DTO 里写的是 @Type(() => Number) age: number
那么它会帮你自动转成 { age: 18 }(数字),再去校验。

示例:

import { Type } from 'class-transformer';
import { IsInt, Min } from 'class-validator';export class CreateUserDto {@Type(() => Number)  // 👈 转换字符串为数字@IsInt()@Min(1)age: number;
}

✅ 作用:避免前端传 "1" 时被当作字符串校验错误。


(2)响应数据的序列化(class → plain)

当你返回一个类实例时,class-transformer 能帮你过滤、隐藏或格式化返回字段。

比如你不想返回密码字段:

import { Exclude, Expose } from 'class-transformer';export class UserEntity {id: number;username: string;@Exclude()  // 👈 不会出现在响应中password: string;@Expose()get profileUrl() {return `/users/${this.id}`;}
}

在控制器中:

@Get(':id')
getUser() {return plainToInstance(UserEntity, userFromDB);
}

返回结果自动是:

{"id": 1,"username": "Alice","profileUrl": "/users/1"
}

🧠 2. 它与 class-validator 的关系

功能项class-transformerclass-validator
是否验证字段❌ 否✅ 是
是否改变数据类型✅ 是❌ 否
是否生成类实例✅ 是❌ 否
是否用于响应输出✅ 是❌ 否
是否和 ValidationPipe 联动✅ 是(transform 开启)✅ 是

在 NestJS 里,这两者经常配合使用,例如:

app.useGlobalPipes(new ValidationPipe({transform: true, // 👈 开启 class-transformerwhitelist: true,}),
);

这行代码会让:

  1. Nest 自动把请求 JSON 转成 DTO 实例;
  2. 自动类型转换(如果有 @Type);
  3. 校验时不包含多余字段。

🔍 3. 为什么在 Zod 架构中就不用它了?

因为 Zod 自带类型推导和运行时验证,数据类型转换和结构校验可以直接在 schema 内完成,不再需要 class + 装饰器的方式。

比如👇
Zod 直接定义好类型、默认值、转换逻辑:

const LoginSchema = z.object({username: z.string().min(1),age: z.preprocess(val => Number(val), z.number().int().min(1)),
});

这里 z.preprocess 的功能就相当于 class-transformer@Type(() => Number)

✅ 所以在 Zod 架构中,不再依赖 class-transformer,整个 DTO 就可以删掉。


🧩 4. 总结一下

对比点class-transformer 作用是否在 Zod 中仍需
请求参数类型转换把字符串转数字、日期等❌(Zod 内部可做)
响应数据隐藏字段@Exclude、@Expose✅(可用自定义函数代替)
类实例创建plain → class❌(Zod 直接校验对象)
Swagger 类型推断依赖装饰器❌(Zod → OpenAPI 替代)

💬 一句话收尾

class-transformer 是旧架构的“形态塑造器”,让前端传的 plain 数据符合 DTO 形状;
在 Zod 架构下,它的功能被 Schema 内部的类型系统自然取代。


http://www.dtcms.com/a/495374.html

相关文章:

  • 【word多文档docx合并】
  • Endnote | word中加载项消失不见,如何处理?
  • 聊聊 Unity(小白专享、C# 小程序 之 图片播放器)
  • 查询个人房产信息网站查看wordpress密码破解
  • 做网站用什么框架dede淘宝客网站
  • 高级篇:Python脚本(101-150)
  • pdf解析工具---Miner-u 本地部署记录
  • 怎么快速做网站文章新乡个人网站建设价格
  • 关于.net网站开发外文书籍wordpress子标题
  • 基于OpenIddict6.4.0搭建授权认证服务
  • 中国建设银行网站企业北京网站维护一般价格多少
  • shell编程语言---正则表达式,grep
  • JoyAgent问数多表关联Bug修复
  • 网站建设投标书报价表高端网站设计思路
  • 【玩泰山派】8、泰山派安装armbian,玩armbian
  • 雄安建设集团 网站推荐个在广州做网站的
  • vue3加载shp文件 并地图上展示
  • 实战:用PyTorch构建你的第一个图像分类CNN模型
  • 淄博网站建设优化公司wordpress后台登录网址
  • 每日一个网络知识点:网络层NAT
  • 不花钱网站怎么做推广小程序同步wordpress
  • 哈尔滨站建好了吗做网站机构图用什么工具
  • 基于ArcGIS的生态敏感性分析案例 | 绿水青山就是金山银山
  • adb root啥意思?adb remount啥意思?
  • PySide6 自定义文本查找对话框(QFindTextDialog)以及调用示例——重构版
  • TypeScript 面试题及详细答案 100题 (41-50)-- 函数类型
  • 静态网站建设要学什么做网站然后推广
  • 访问不了服务器的网站《水利建设与管理》杂志社网站
  • Vue3 创建项目指南
  • 迅为iTOP-Hi3516CV610开发板海思3516V610S应用安防监控AI智能视觉