添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

test-grpc 目录下创建以下文件,结构如下

    ├── src/                            # 源代码
    │   ├── proto/                      # Proto 文件
    │   │   ├── greeter/                # Greeter gRPC service
    │   │   │   └── greeter.proto        
    ├── scripts/                        # 脚本工具
    │   └── protoc.sh                   # 根据proto文件生成 js/ts代码脚本
    └── ...

初始化项目、安装相关包

npm init -y
npm install grpc -protobuf dotenv
npm install typescript @types/node @types-protobuf @types/dotenv --save-dev
  • grpc 用于gRPC与Node.js结合使用
  • -protobuf 用于javascript一起使用protobuf(.proto)
  • dotenv从.env加载环境变量

编辑tsconfig

npx tsc --init

将以下内容添加到tsconfig.json文件中

"compilerOptions": { "outDir": "./dist/", "module": "commonjs", "noImplicitAny": true, "allowJs": true, "esModuleInterop": true, "target": "es6", "sourceMap": true "include": ["./src/**/*"], "exclude": ["node_modules"]

安装代码生成工具

npm install grpc-tools grpc_tools_node_protoc_ts --save-dev
  • grpc-tools 为原始文件.proto生成javascript文件
  • grpc_tools_node_protoc_ts 根据grpc-tools生成的js代码生成相应的d.ts代码

创建脚本并执行

scripts/protoc.sh

#!/usr/bin/env bash
BASEDIR=$(dirname "$0")
cd "${BASEDIR}"/../
PROTOC_GEN_TS_PATH="./node_modules/.bin/protoc-gen-ts"
GRPC_TOOLS_NODE_PROTOC_PLUGIN="./node_modules/.bin/grpc_tools_node_protoc_plugin"
GRPC_TOOLS_NODE_PROTOC="./node_modules/.bin/grpc_tools_node_protoc"
for f in ./src/proto/*; do
  # skip the non proto files
  if [ "$(basename "$f")" == "index.ts" ]; then
      continue
  # loop over all the available proto files and compile them into respective dir
  # JavaScript code generating
  ${GRPC_TOOLS_NODE_PROTOC} \
      --js_out=import_style=commonjs,binary:"${f}" \
      --grpc_out="${f}" \
      --plugin=protoc-gen-grpc="${GRPC_TOOLS_NODE_PROTOC_PLUGIN}" \
      -I "${f}" \
      "${f}"/*.proto
  ${GRPC_TOOLS_NODE_PROTOC} \
      --plugin=protoc-gen-ts="${PROTOC_GEN_TS_PATH}" \
      --ts_out="${f}" \
      -I "${f}" \
      "${f}"/*.proto
sudo chmod +x ./scripts/protoc.sh
./scripts/protoc.sh

会生成四个文件:一个pb、一个grpc_pb(并生成了相应的ts代码)

src/proto/greeter
├── greeter.proto
├── greeter_grpc_pb.d.ts
├── greeter_grpc_pb.js
├── greeter_pb.d.ts
└── greeter_pb.js