如何用ts-proto生成同时兼容NestJS与TypeScript的Proto文件?
解决ts-proto同时生成NestJS服务端兼容代码与TypeScript客户端实现的问题
首先纠正一个常见参数拼写错误:ts-proto中控制客户端实现生成的参数是clientImpl(不是你提到的clientImp),这可能是你之前配置无效的原因之一。
方法一:通过复合配置同时生成两种代码
直接在编译命令或配置文件中同时开启nestjs=true和clientImpl=true,并指定客户端类型,即可生成同时兼容NestJS服务端和TypeScript客户端的代码。
示例protoc命令:
protoc \ --plugin=./node_modules/.bin/protoc-gen-ts_proto \ --ts_proto_out=./src/proto \ --ts_proto_opt=nestjs=true,clientImpl=true,outputClientImpl=grpc-web \ ./proto/*.proto
示例buf.yaml配置:
version: v1 plugins: - name: ts_proto out: src/proto opt: - nestjs=true - clientImpl=true - outputClientImpl=grpc-node # 根据客户端环境选择grpc-web/grpc-node等
生成的文件会同时包含:
- NestJS服务端所需的控制器接口(如
UserServiceController),你的NestJS控制器类可以直接实现该接口,保证与proto定义的一致性 - TypeScript客户端实现类(如
UserServiceClient),可直接在客户端代码中实例化并调用服务方法
方法二:分两次生成(适用于旧版ts-proto)
如果上述复合配置在你使用的ts-proto版本中不生效,可以分两次编译:
- 第一次编译生成NestJS服务端代码:
protoc \ --plugin=./node_modules/.bin/protoc-gen-ts_proto \ --ts_proto_out=./server/src/proto \ --ts_proto_opt=nestjs=true \ ./proto/*.proto
- 第二次编译生成客户端代码:
protoc \ --plugin=./node_modules/.bin/protoc-gen-ts_proto \ --ts_proto_out=./client/src/proto \ --ts_proto_opt=clientImpl=true,outputClientImpl=grpc-web \ ./proto/*.proto
这种方式虽然会生成两份类型定义,但能确保服务端和客户端各自获取所需的代码。
注意事项
- 确保使用最新版的ts-proto,旧版本可能存在同时开启两个选项的兼容性问题
outputClientImpl参数需根据你的客户端环境选择:grpc-web用于浏览器端,grpc-node用于Node.js客户端,grpc-js用于基于@grpc/grpc-js的客户端
内容的提问来源于stack exchange,提问作者Hammad
相关产品推荐
相关产品推荐

