## 序列化(Serialization)
序列化(`Serialization`)是一個在網絡響應中返回對象前的過程。 這是一個適合轉換和凈化要返回給客戶的數據的地方。例如,應始終從最終響應中排除敏感數據(如用戶密碼)。此外,某些屬性可能需要額外的轉換,比方說,我們只想發送一個實體的子集。手動完成這些轉換既枯燥又容易出錯,并且不能確定是否覆蓋了所有的情況。
> 譯者注: `Serialization` 實現可類比 `composer` 庫中 `fractal` ,響應給用戶的數據不僅僅要剔除設計安全的屬性,還需要剔除一些無用字段如 `create_time`, `delete_time`,` update_time` 和其他屬性。在 `JAVA` 的實體類中定義 `N` 個屬性的話就會返回 `N` 個字段,解決方法可以使用范型編程,否則操作實體類回影響數據庫映射字段。
### 概要
為了提供一種直接的方式來執行這些操作, `Nest` 附帶了這個 `ClassSerializerInterceptor` 類。它使用[類轉換器](https://github.com/typestack/class-transformer)來提供轉換對象的聲明性和可擴展方式。基于此類基礎下,可以從類轉換器中獲取方法和調用 `classToPlain()` 函數返回的值。要這樣做,可以將由`class-transformer`裝飾器提供的規則應用在實體/DTO 類中,如下所示:
### 排除屬性
我們假設要從一個用戶實體中自動排除`password`屬性。我們給實體做如下注釋:
```typescript
import { Exclude } from 'class-transformer';
export class UserEntity {
id: number;
firstName: string;
lastName: string;
@Exclude()
password: string;
constructor(partial: Partial<UserEntity>) {
Object.assign(this, partial);
}
}
```
然后,直接在控制器的方法中調用就能獲得此類的實例。
```typescript
@UseInterceptors(ClassSerializerInterceptor)
@Get()
findOne(): UserEntity {
return new UserEntity({
id: 1,
firstName: 'Kamil',
lastName: 'Mysliwiec',
password: 'password',
});
}
```
> 請注意,我們必須返回一個類的實體。如果你返回一個普通的 JavaScript 對象,例如,`{user: new UserEntity()}`,該對象將不會被正常序列化。
> 提示: `@ClassSerializerInterceptor()` 裝飾器來源于 `@nestjs/common` 包。
現在當你調用此服務時,將收到以下響應結果:
```json
{
"id": 1,
"firstName": "Kamil",
"lastName": "Mysliwiec"
}
```
注意,攔截器可以應用于整個應用程序(見[這里](https://docs.nestjs.com/interceptors#binding-interceptors))。攔截器和實體類聲明的組合確保返回 `UserEntity` 的任何方法都將確保刪除 `password` 屬性。這給你一個業務規則的強制、集中的評估。
### 公開屬性
您可以使用 `@Expose()` 裝飾器來為屬性提供別名,或者執行一個函數來計算屬性值(類似于 `getter` 函數),如下所示。
```typescript
@Expose()
get fullName(): string {
return `${this.firstName} ${this.lastName}`;
}
```
### 變換
您可以使用 `@Transform()` 裝飾器執行其他數據轉換。例如,您要選擇一個名稱 `RoleEntity` 而不是返回整個對象。
```typescript
@Transform(role => role.name)
role: RoleEntity;
```
### 傳遞選項
你可能想要修改轉換函數的默認行為。要覆蓋默認設置,請使用 `@SerializeOptions()` 裝飾器來將其傳遞給一個`options`對象。
```typescript
@SerializeOptions({
excludePrefixes: ['_'],
})
@Get()
findOne(): UserEntity {
return {};
}
```
> 提示: `@SerializeOptions()` 裝飾器來源于 `@nestjs/common` 包。
通過 `@SerializeOptions()` 傳遞的選項作為底層 `classToPlain()` 函數的第二個參數傳遞。在本例中,我們自動排除了所有以`_`前綴開頭的屬性。
### Websockets 和 微服務
雖然本章展示了使用 `HTTP` 風格的應用程序的例子(例如,`Express` 或 `Fastify` ),但是 `ClassSerializerInterceptor`對于 `WebSockets` 和微服務的工作方式是一樣的,不管使用的是哪種傳輸方法。
### 了解更多
想了解有關裝飾器選項的更多信息,請訪問此[頁面](https://github.com/typestack/class-transformer)。
- 介紹
- 概述
- 第一步
- 控制器
- 提供者
- 模塊
- 中間件
- 異常過濾器
- 管道
- 守衛
- 攔截器
- 自定義裝飾器
- 基礎知識
- 自定義提供者
- 異步提供者
- 動態模塊
- 注入作用域
- 循環依賴
- 模塊參考
- 懶加載模塊
- 應用上下文
- 生命周期事件
- 跨平臺
- 測試
- 技術
- 數據庫
- Mongo
- 配置
- 驗證
- 緩存
- 序列化
- 版本控制
- 定時任務
- 隊列
- 日志
- Cookies
- 事件
- 壓縮
- 文件上傳
- 流式處理文件
- HTTP模塊
- Session(會話)
- MVC
- 性能(Fastify)
- 服務器端事件發送
- 安全
- 認證(Authentication)
- 授權(Authorization)
- 加密和散列
- Helmet
- CORS(跨域請求)
- CSRF保護
- 限速
- GraphQL
- 快速開始
- 解析器(resolvers)
- 變更(Mutations)
- 訂閱(Subscriptions)
- 標量(Scalars)
- 指令(directives)
- 接口(Interfaces)
- 聯合類型
- 枚舉(Enums)
- 字段中間件
- 映射類型
- 插件
- 復雜性
- 擴展
- CLI插件
- 生成SDL
- 其他功能
- 聯合服務
- 遷移指南
- Websocket
- 網關
- 異常過濾器
- 管道
- 守衛
- 攔截器
- 適配器
- 微服務
- 概述
- Redis
- MQTT
- NATS
- RabbitMQ
- Kafka
- gRPC
- 自定義傳輸器
- 異常過濾器
- 管道
- 守衛
- 攔截器
- 獨立應用
- Cli
- 概述
- 工作空間
- 庫
- 用法
- 腳本
- Openapi
- 介紹
- 類型和參數
- 操作
- 安全
- 映射類型
- 裝飾器
- CLI插件
- 其他特性
- 遷移指南
- 秘籍
- CRUD 生成器
- 熱重載
- MikroORM
- TypeORM
- Mongoose
- 序列化
- 路由模塊
- Swagger
- 健康檢查
- CQRS
- 文檔
- Prisma
- 靜態服務
- Nest Commander
- 問答
- Serverless
- HTTP 適配器
- 全局路由前綴
- 混合應用
- HTTPS 和多服務器
- 請求生命周期
- 常見錯誤
- 實例
- 遷移指南
- 發現
- 誰在使用Nest?