NestJS gRPC传对象数组时triggers/actions返回[object Object]如何解决
问题根因与修复方案
核心排查顺序
先在plainToClass调用前加一行日志,直接打印gRPC返回的原始响应,看triggers、actions字段的类型:
- 如果日志里这俩字段已经是
'[object Object]'字符串,问题100%出在gRPC序列化/proto定义层,和class-transformer配置无关 - 如果日志里这俩字段是正常的对象/对象数组,问题出在DTO定义和
plainToClass配置层
场景1:gRPC层返回值已经是错误字符串
这是90%同类问题的诱因,对应两个常见错误:
Proto字段类型定义错误
如果你在.proto文件里把triggers、actions声明成了string类型,gRPC序列化时会默认对传入的对象执行toString()转换,直接得到[object Object]字符串,后续不管怎么转DTO都拿不到正确值。
修复方式:把对应字段改成自定义嵌套message类型,数组字段加repeated修饰符,示例:// 先定义嵌套结构的message message Trigger { string type = 1; string config = 2; // 按实际业务补全字段 } message Action { string type = 1; string config = 2; // 按实际业务补全字段 } message RuleMessage { // 其他基础字段省略 repeated Trigger triggers = 6; // 不要写string triggers = 6 repeated Action actions = 7; }改完proto必须重新生成对应的TS类型定义,不要手写和生成代码冲突的interface。
自定义序列化/反序列化逻辑误转字符串
检查你写的proto编解码工具函数,是不是写了类似“非基础类型统一转字符串”的兼容逻辑,误把对象/数组走到了toString()或者错误的JSON.stringify()分支,直接修正类型判断逻辑即可,对象类型要走嵌套message的解码逻辑。
场景2:gRPC返回原始值是正常对象数组
这种情况问题出在class-transformer配置上:
- 你只给入参的
RuleCreateBulkRequestDto加了@Type、@ValidateNested装饰器,返回用的RuleDto没给嵌套字段加装饰器,plainToClass默认不会递归转换嵌套结构。
修复:给RuleDto的对应字段补全@Type装饰器,指定嵌套类:import { Type } from 'class-transformer'; import { TriggerDto, ActionDto } from './dto'; export class RuleDto { // 其他字段省略 @Type(() => TriggerDto) triggers: TriggerDto[]; @Type(() => ActionDto) actions: ActionDto[]; } plainToClass调用时没开隐式转换配置,补充配置项即可:const ruleInstance = plainToClass(RuleDto, rawGrpcResponse, { enableImplicitConversion: true, // 开启类型自动转换 excludeExtraneousValues: false // 按自身业务需求调整 });
内容的提问来源于stack exchange,提问作者ali
相关产品推荐
相关产品推荐

