前置き
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,
}})