non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

DeprecationWarning: grpc.load: Use the @grpc/proto-loader module with grpc.loadPackageDefinition insteadの警告を消すには

こんばんは、長男が数日前から口内炎が酷くて、大好きなミニトマトがシミて食べれません。また大好きなデザートのブドウも同様に食べられない状態が続いてます。@kjunichiです。

背景

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())

参考資料

今回の作業で@で始まるパッケージ名なんてあるんだと思ったら、以下の記事を見つけた。

efcl.info

結構前からこういう命名方法があった模様。

関連記事