背景
gopheronで最近作ったnode.jsベースのgrpcのクライアントを動かすと以下の警告が表示されるようになった。
(node:5871) DeprecationWarning: grpc.load: Use the @grpc/proto-loader module with grpc.loadPackageDefinition instead
対策
@grpc/proto-loaderモジュールを使う
「Use the @grpc/proto-loader module」と言われているように「@grpc/proto-loader」モジュールをnpm installしてこれをrequireする。
npm i @grpc/proto-loader --save
const protoLoader = require('@grpc/proto-loader')
grpc.loadの箇所の変更
サンプルのhelloworldを例にすると、以下の様に変更する
grpc.load一行で済んでいた処理が、
- protoLoader#loadSyncでprotobufパッケージの定義をロード
- ロードしたパッケージ定義をgrp#loadPackageDefinitionでロードしてgRPCでプロトコル記述子を生成
- 生成されたプロトコル記述子から利用したパッケージ名を指定してクライアントを取得。
といったような流れに変更になった模様。
今回の変更でProtocol Buffersに依存した実装が、別パッケージの@grpc/proto-loaderに移ることで、 gRPCモジュール本体のProtocol Buffersへの依存をなくした模様?。 もしかすると、Node.js実装以外はすでにそういう実装だったのかも? とおもい、goのコードを眺めたが、go力が低すぎてよくわからなかったw
const packageDefinition = protoLoader.loadSync( PROTO_PATH, { keepCase: true, longs: String, enums: String, defaults: true, oneofs: true } ) const protoDescriptor = grpc.loadPackageDefinition(packageDefinition) const helloworld = protoDescriptor.helloworld
以降は、従来通りの模様。
const client = new helloworld.Greeter('remotehost:50051', grpc.credentials.createInsecure())
参考資料
今回の作業で@で始まるパッケージ名なんてあるんだと思ったら、以下の記事を見つけた。
結構前からこういう命名方法があった模様。