Protobuf.jsを使って.protoファイルからNode.jsのprotobufのjavascriptコードを生成する


環境

$ node -v 
v10.15.3

前提

$ npm i -g protobufjs
$ pbjs                                                                                                                                                    
protobuf.js v6.7.0 CLI for JavaScript
...

※ protobufjsをインストールすると pbjs でcliツールを呼び出すことができる

前提として次の hero.proto がheroディレクトリ以下にある状態でこの後の手順を解説する。
これは、nestjsの sample/04-grpc から拝借した。

syntax = "proto3";

package hero;

service HeroService {
  rpc FindOne (HeroById) returns (Hero) {}
}

message HeroById {
  int32 id = 1;
}

message Hero {
  int32 id = 1;
  string name = 2;
}

生成する

次のコマンドを実行して生成する。
オプションが複数になるのと、環境に依存するpathを使用する箇所があるので、シェルスクリプト化しても良さそう。

pbjs \
--target static-module \
--wrap commonjs \
--keep-case \
--out ./hero_pb.js \
./hero/hero.proto
  • --target
    • 出力ファイルのフォーマットを指定
  • --wrap
    • 使用するwrapperの指定
  • --keep-case
    • .protoのmessage定義がcamelCaseに変換されることを防ぐオプション
  • --out
    • 出力ファイル名

全オプションを確認したい場合は、 pbjs を引数無しで実行すれば利用できるオプション一覧が表示される。

生成されるファイルの確認

  • hero_pb.js
    • protobufのmessageオブジェクトをjavascriptのclassで表現したもの

--out オプションで指定したファイル名でclient実装が生成されることがわかる。
生成されたファイルの内容をここに貼り付けることはしないが、hero_pb.jsの内容を確認すると、.protoに定義した通りのスキーマでprotobufのmessageオブジェクトのコードが生成されているのがわかる。

参考