NestJS调用GRPC接口时响应中空列表字段无法显示问题
问题根因
不属于配置遗漏,是Protobuf3默认序列化规则与NestJS gRPC模块默认加载配置共同作用的结果:
- Protobuf3 规范中,repeated类型字段的默认值为空数组
[],默认序列化逻辑会直接省略所有值为默认值的字段,不会出现在最终输出的JSON结构中。 - 通过blrromRPC调用时能看到空的
flags字段,是因为该工具默认开启了「展示默认值字段」的开关,而NestJS依赖的@grpc/proto-loader默认关闭该开关,因此空数组字段会被直接过滤。 - 该过滤仅发生在对象转JSON的展示层,原始响应的字段定义实际存在,不存在数据丢失问题。
解决方法
调整gRPC模块的proto loader配置即可:在注册gRPC服务/客户端的配置块中,给loader字段追加两个参数,原有配置全部保留:
// 对应GrpcModule注册的代码位置,通常在app.module.ts GrpcModule.forRoot({ // 原有配置项保持不变,比如protoPath、package、服务地址、鉴权配置等 loader: { // 原有loader配置保持不变,比如keepCase、longs类型处理配置等 defaults: true, // 强制输出所有取值为默认值的字段 arrays: true, // 强制输出空数组字段,即使值为默认空 } })
配置修改完成后重启服务,再次调用接口即可看到完整的flags空数组字段。
如果调整loader配置后仍未生效,检查代码中是否存在手动对gRPC响应做toObject或JSON序列化的逻辑,序列化时需要同步传入对应参数:
// 手动序列化gRPC响应对象的场景 const formattedResp = rawResp.toObject({ defaults: true, arrays: true })
内容的提问来源于stack exchange,提问作者Erika
相关产品推荐
相关产品推荐

