package ctxdata import ( "context" "encoding/json" "errors" "fmt" ) const CtxKeyJwtUserId = "userId" // 定义错误类型 var ( ErrNoUserIdInCtx = errors.New("上下文中没有用户ID") // 未登录 ErrInvalidUserId = errors.New("用户ID格式无效") // 数据异常 ) // GetUidFromCtx 从 context 中获取用户 ID func GetUidFromCtx(ctx context.Context) (int64, error) { // 尝试从上下文中获取 jwtUserId value := ctx.Value(CtxKeyJwtUserId) if value == nil { return 0, ErrNoUserIdInCtx } // 尝试转换为 json.Number jsonUid, ok := value.(json.Number) if !ok { return 0, fmt.Errorf("%w: 期望类型 json.Number, 实际类型 %T", ErrInvalidUserId, value) } // 转换为 int64 uid, err := jsonUid.Int64() if err != nil { return 0, fmt.Errorf("%w: %v", ErrInvalidUserId, err) } return uid, nil } // IsNoUserIdError 判断是否是未登录错误 func IsNoUserIdError(err error) bool { return errors.Is(err, ErrNoUserIdInCtx) } // IsInvalidUserIdError 判断是否是用户ID格式错误 func IsInvalidUserIdError(err error) bool { return errors.Is(err, ErrInvalidUserId) }