最近项目增加node的bff(Backends For Frontends)层,后端用了golang&gRPC。node端使用了nestjs框架,为了ts能够识别proto定义的接口,希望通过proto生成gRPC接口文件,期间绕了不少弯路,简单分享下。

首先组内同学找到这个库
https://github.com/agreatfool/grpc_tools_node_protoc_ts
按照示例,命令如下,发现不好用

npm install grpc_tools_node_protoc_ts --save-dev

# generate js codes via grpc-tools
grpc_tools_node_protoc \
--js_out=import_style=commonjs,binary:./your_dest_dir \
--grpc_out=./your_dest_dir \
--plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` \
-I ./proto \
./your_proto_dir/*.proto

# generate d.ts codes
protoc \
--plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts \
--ts_out=./your_dest_dir \
-I ./proto \
./your_proto_dir/*.proto

遂改造如下

grpc_tools_node_protoc --js_out=import_style=commonjs,binary:./src/types \
                       --grpc_out=./src/types \
                       --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` \
                       -I ./proto proto/*.proto
grpc_tools_node_protoc --plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts \
                       --ts_out=./src/types \
                       -I ./proto ./proto/*.proto

结果发现还是不好用,最后仔细看了
https://github.com/grpc/grpc-node
又阅读了部分nestjs源码,发现是我们理解错了,项目上用的是nestjs封装的gRPC,而其采用的并不是预生成代码的形式,运行时需要加载proto源码动态解析

于是找到了nestjs所封装的形式对应所需的client interface生成工具
https://github.com/kondi/rxjs-grpc

总结:第二种方案虽然轻量,但性能肯定不如第一种,但nestjs默认实例化方式选择了这种,为了沿用其rxjs返回形式,暂时直接采用了官方方案,其实也可以通过对客户端进行二次封装达到rxjs的效果(第一种方案生成的客户端是回调函数形式,没有进行封装)

简单记录下,方便有此需求的同学填坑