NestJS中Redis hgetall返回的字符串值如何转换为对应目标类型?
NestJS Redis hgetall返回结果自动类型转换方案
你可以通过class-transformer库实现你要的自动转换效果,无需手动逐个字段处理,配置一次即可复用。
步骤1:安装依赖
npm install class-transformer
步骤2:定义带转换规则的DTO
注意不要用interface定义DTO,改用class(interface运行时无元数据,无法实现自动转换),同时给每个字段配置对应转换规则:
import { Transform, Type } from 'class-transformer'; // 自定义通用转换装饰器:将逗号分隔的字符串转为数组,空字符串直接返回空数组 const CommaStringToArray = () => Transform(({ value }) => { return typeof value === 'string' && value.length > 0 ? value.split(',') : []; }); export class RoomInfoDTO { // 字符串转布尔值:判断是否等于'true' @Transform(({ value }) => value === 'true') isOpen: boolean; @Transform(({ value }) => value === 'true') isPublic: boolean; // 字符串转数字 @Type(() => Number) cashPerPoint: number; @Type(() => Number) gameCount: number; @Type(() => Number) maxPlayers: number; // 逗号分隔字符串转数组 @CommaStringToArray() currentPlayers: string[]; @CommaStringToArray() roomPlayers: string[]; @Transform(({ value }) => value === 'true') gameStarted: boolean; @Transform(({ value }) => value === 'true') gameOver: boolean; @Transform(({ value }) => value === 'true') instantStart: boolean; }
步骤3:实现你要的调用效果
封装通用转换方法后,即可直接调用得到类型正确的结果:
import { plainToInstance } from 'class-transformer'; // 通用转换方法 const CONVERT = <T>(dtoClass: new () => T, plainData: object): T => { return plainToInstance(dtoClass, plainData); }; // 业务代码直接调用,和你预期的写法完全一致 const data: RoomInfoDTO = CONVERT(RoomInfoDTO, await this.asyncHGetAllFromRedis(key));
可选扩展:搭配Nest全局Pipe自动转换
如果是接口返回场景,你可以直接开启Nest全局ValidationPipe的自动转换能力,无需手动调用CONVERT方法:
// main.ts 全局配置 import { ValidationPipe } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalPipes(new ValidationPipe({ transform: true, // 开启自动类型转换 })); await app.listen(3000); } bootstrap();
配置完成后,Controller中直接指定返回类型为RoomInfoDTO即可自动完成转换。
内容的提问来源于stack exchange,提问作者swatantra
相关产品推荐
相关产品推荐

