Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

環境

$ 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オブジェクトのコードが生成されているのがわかる。

参考

daikiojm
Blog: http://daikiojm.hatenablog.com Scrapbox: https://scrapbox.io/daikiojm
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away