GRPC服务端返回的错误如何被客户端正确处理?
需求服务端有个根据手机号查找用户的方法,分三种情况:找不到、能找到(返回用户信息)、出错。客户端想实现判断手机号是否已经注册,想利用这个方法。服务端代码大致如下:
func (u *UserServer) GetUserByMobile(ctx context.Context, req *userpb.MobileRequest) (*userpb.UserInfoResponse, error) {
var user model.User
result := global.DB.Where(&model.User{Mobile: req.Mobile}).First(&user)
if result.RowsAffected == 0 {
return nil, status.Errorf(codes.NotFound, "用户不存在")
}
if result.Error != nil {
return nil, status.Errorf(codes.Internal, "内部错误")
}
userInfoRsp := ModelToResponse(user) //模型转响应用的。
return &userInfoRsp, nil
}
客户端代码大致如下(省去表单验证等环节):
rsp, err := userClient.GetUserByMobile(ctx, &userpb.MobileRequest{Mobile: phoneExistForm.Mobile})
if err != nil {
ctx.JSON(http.StatusInternalServerError, gin.H{
"msg": "internal error",
})
return
}
if rsp.Id == 0 {
ctx.JSON(http.StatusOK, gin.H{
"msg": "this phone is not in use",
})
return
}
ctx.JSON(http.StatusOK, gin.H{
"msg": "this phone is already in use",
})
调用接口,输入一个已经被使用的手机号,提示手机号已经被使用,符合预期。但是输入一个没有被使用的手机号,提示internal error,也不知道哪个环节出了问题,求大佬解答。
你的代码可以改为如下: