# rpc 错误：code = InvalidArgument desc = proto: User: 字段 "email" 为必填

- **ID:** `go/grpc-failed-precondition-required-field`
- **领域:** go
- **类别:** data_error
- **验证级别:** ai_generated
- **修复率:** 80%

## 根因

protoc-gen-validate（PGV）或较新的 protovalidate 规则因必填字段为空而拒绝该消息。服务端返回带验证消息的 InvalidArgument。

## 版本兼容性

| 版本 | 状态 | 引入 | 弃用 |
|------|------|------|------|
| github.com/envoyproxy/protoc-gen-validate 1.x | active | — | — |

## 解决方案

1. **** (90% 成功率)
   ```
   if err := user.Validate(); err != nil {
    return fmt.Errorf("invalid user: %w", err)
}
resp, err := client.Create(ctx, user)
   ```
2. **** (85% 成功率)
   ```
   st := status.New(codes.InvalidArgument, "validation failed")
br := &errdetails.BadRequest{FieldViolations: []*errdetails.BadRequest_FieldViolation{
    {Field: "email", Description: "required"},
}}
st, _ = st.WithDetails(br)
return nil, st.Err()
   ```

## 无效尝试

- **** — Removes all input safety checks and allows malformed data into downstream systems. (90% 失败率)
- **** — PGV rules like min_len:1 still reject empty strings; only non-empty values pass. (85% 失败率)
