From 8f50c2ce9bbcbe8582c1b78e8b678c45f1740e82 Mon Sep 17 00:00:00 2001 From: yun Date: Fri, 2 Oct 2026 22:53:10 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=82=E9=85=8D=20errorx=20v1.2=EF=BC=9A?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E5=80=BC=E4=B8=8D=E6=8C=81=E6=9C=89=20ctx?= =?UTF-8?q?=EF=BC=8C=E6=94=B9=E7=94=A8=20errors.As=20+=20GetCode/Msg(ctx)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - response.go: errorx.As/val.Code() 换成 errors.As(errorx.ErrorInterface) 取 GetCode(),文案改用 Msg(ctx) 按请求语言渲染(errorx v1.2 起错误值只保存语言, 渲染时再传 ctx)。 - FormatMessage: langx v0.1 起未知 key 的默认码从 200 变成 -1,命中默认码时 回落到 SetDefaultSuccessCode,保持升级前 code:200 的行为。 - go.mod: github.com/yuninks/errorx v1.2.0 / github.com/yuninks/langx v0.1.0。 --- example_test.go | 10 +++++----- go.mod | 4 ++-- go.sum | 8 ++++---- response.go | 20 ++++++++++++++++---- 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/example_test.go b/example_test.go index 5bb3187..5813d06 100755 --- a/example_test.go +++ b/example_test.go @@ -66,8 +66,8 @@ func ExampleError() { // 实际项目中通常在单独的 errors 包里用 var 声明一次 var ( - ExampleErrParamsInvalid = errorx.NewCode("example_params_invalid", 40001, "参数异常") - ExampleErrNotFound = errorx.NewCode("example_not_found", 40004, "资源不存在") + ExampleErrParamsInvalid = errorx.New("example_params_invalid", 40001, "参数异常") + ExampleErrNotFound = errorx.New("example_not_found", 40004, "资源不存在") ) func ExampleError_businessCode() { @@ -81,7 +81,7 @@ func ExampleError_businessCode() { // 中文请求 w := httptest.NewRecorder() responsex.Error(context.Background(), w, - ExampleErrParamsInvalid.New(context.Background()), + ExampleErrParamsInvalid.Err(), responsex.SetIgnoreLog(), ) fmt.Println("zh:", w.Body.String()) @@ -90,7 +90,7 @@ func ExampleError_businessCode() { ctxEn := langx.SetCtxLang(context.Background(), "en") w = httptest.NewRecorder() responsex.Error(ctxEn, w, - ExampleErrParamsInvalid.New(ctxEn), + ExampleErrParamsInvalid.Err(), responsex.SetIgnoreLog(), ) fmt.Println("en:", w.Body.String()) @@ -106,7 +106,7 @@ func ExampleErrorWithData() { w := httptest.NewRecorder() responsex.ErrorWithData(context.Background(), w, - ExampleErrParamsInvalid.New(context.Background()), + ExampleErrParamsInvalid.Err(), map[string]any{"field": "email", "reason": "格式不正确"}, responsex.SetHttpStatusCode(http.StatusBadRequest), responsex.SetIgnoreLog(), diff --git a/go.mod b/go.mod index d11d0cc..12cf1e5 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,6 @@ module code.yun.ink/pkg/responsex go 1.22.4 require ( - github.com/yuninks/errorx v1.0.0 - github.com/yuninks/langx v0.0.7 + github.com/yuninks/errorx v1.2.0 + github.com/yuninks/langx v0.1.0 ) diff --git a/go.sum b/go.sum index de27b8d..c603d17 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,4 @@ -github.com/yuninks/errorx v1.0.0 h1:/AS4dSEVPkfvs3hJFYgqYBFLKyVvxFV32XXbMXoHwvk= -github.com/yuninks/errorx v1.0.0/go.mod h1:N9e4ShfCTkLjHnGShAG0x9n2SYtCDKhKDMxRmyr05hU= -github.com/yuninks/langx v0.0.7 h1:QUt27h/FjnT7//759GoM/+p4ew+HBr10ZN/fkqeQfyA= -github.com/yuninks/langx v0.0.7/go.mod h1:nAylzjNIjCThhEQSJsIKP8Vhja0aJlcyig+NsNPZLSk= +github.com/yuninks/errorx v1.2.0 h1:x9ZBvx8L58mm0dHzKN7COFCQ/MTeZgeR2Gp/wWa+ZEE= +github.com/yuninks/errorx v1.2.0/go.mod h1:5Z4rL9HiANUtonWiGZsVisqG2dyrt7c3lKKTdpyw2g0= +github.com/yuninks/langx v0.1.0 h1:yqflUw7a+G6i073GzpQppuA/ftPtDh9Azlcr4OtetFE= +github.com/yuninks/langx v0.1.0/go.mod h1:nAylzjNIjCThhEQSJsIKP8Vhja0aJlcyig+NsNPZLSk= diff --git a/response.go b/response.go index 7020208..b6200be 100755 --- a/response.go +++ b/response.go @@ -6,6 +6,7 @@ package responsex import ( "context" "encoding/json" + "errors" "net/http" "github.com/yuninks/errorx" @@ -58,6 +59,12 @@ func resolveSuccessMessage(ctx context.Context) string { // Msg格式化响应 func FormatMessage(ctx context.Context, w http.ResponseWriter, msgKey string, format map[string]string, data interface{}, ops ...Option) { code, msg := langx.GetTransFormatCtx(ctx, msgKey, format) + // langx v0.1 起「未知 key」的默认码是 -1(v0.0.x 是 200)。responsex 的成功码 + // 由 SetDefaultSuccessCode 决定,所以把默认码视为「没有业务码」,回落到它, + // 保持与升级前一致的 code:200。 + if code == langx.GetDefaultCode() { + code = op.defaultSuccessCode + } baseOps := []Option{SetCode(code), SetMessage(msg), SetData(data)} baseOps = append(baseOps, ops...) ResponseCtx(ctx, w, baseOps...) @@ -85,12 +92,17 @@ func ErrorWithData(ctx context.Context, w http.ResponseWriter, err error, data i code := op.defaultErrorCode msg := "请求失败" if err != nil { - if val, ok := errorx.As(err); ok { - if langx.GetDefaultCode() != val.Code() { - code = val.Code() + // errorx v1.2 起错误值不再持有 context:错误常量只负责定义与构造, + // 文案要在出口用 Msg(ctx) 按请求语言渲染,业务码用 GetCode() 取。 + var ei errorx.ErrorInterface + if errors.As(err, &ei) { + if bizCode := ei.GetCode(); langx.GetDefaultCode() != bizCode { + code = bizCode } + msg = ei.Msg(ctx) + } else { + msg = err.Error() } - msg = err.Error() } baseOps := []Option{SetCode(code), SetMessage(msg), SetData(data)} baseOps = append(baseOps, ops...)