0
0

More than 1 year has passed since last update.

gRPCでバリデーションエラーを返す方法について

Posted at

前置き

goやgRPCは最近書き始めたばかりなので、間違ったことが記載されている可能性があります。その場合はご指摘いただけると幸いです。

gRPCのエラーの受け方について

バリデーションエラーはHTTPRequestの400エラーで返したいですが、その場合はメタ情報にバリデーションエラーの内容を書く必要があります。BFFがJSあるいはBFFなしで直接繋いでいる場合はまだ公式パッケージにメタ情報からバリデーションエラーを引っこ抜く方法がないため、自分で処理を書く必要があります。

開発環境

フロントエンド

  • React
  • @grpc/grpc-js

バックエンド

  • golang

バックエンド

e := status.New(codes.FailedPrecondition, "メッセージ")
ed, err := e.WithDetails(
    &errdetails.BadRequest{
        FieldViolations: []*errdetails.BadRequest_FieldViolation{
            {
                Field:       "キー値1",
                Description: "バリデーションメッセージ",
            },
            {
                Field:       "キー値2",
                Description: "バリデーションメッセージ",
            },
        },
    },
)
if er != nil {
    return nil, e.Err()
}
return nil, ed.Err()

フロントエンド

const detailsBinary = error.metadata['internalRepr'].get(
'grpc-status-details-bin'
)
detailsBinary?.map((err) => {
if (Buffer.isBuffer(err)) {
  const details = Status.deserializeBinary(new Uint8Array(err))
    .getDetailsList()
    .map((element) => {
      return unpackBadRequest(element)
    })
    return details[0]?.fieldViolationsList[0].description,
}})
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0