Skip to content

Commit 2c593de

Browse files
authored
增加 ErrNoResponse 以规避写两次响应 (#19)
1 parent e5e81e8 commit 2c593de

File tree

3 files changed

+40
-0
lines changed

3 files changed

+40
-0
lines changed

error.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// Copyright 2023 ecodeclub
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package ginx
16+
17+
import "github.com/ecodeclub/ginx/internal/errs"
18+
19+
var ErrNoResponse = errs.ErrNoResponse

internal/errs/error.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,8 @@ import "errors"
1818

1919
var ErrUnauthorized = errors.New("未授权")
2020
var ErrSessionKeyNotFound = errors.New("session 中没找到对应的 key")
21+
22+
// ErrNoResponse 是一个 sentinel 错误。
23+
// 也就是说,你可以通过返回这个 ErrNoResponse 来告诉 ginx 不需要继续写响应。
24+
// 大多数情况下,这意味着你已经写回了响应。
25+
var ErrNoResponse = errors.New("不需要返回 response")

wrapper_func.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ import (
2727
func W(fn func(ctx *Context) (Result, error)) gin.HandlerFunc {
2828
return func(ctx *gin.Context) {
2929
res, err := fn(&Context{Context: ctx})
30+
if errors.Is(err, ErrNoResponse) {
31+
slog.Debug("不需要响应", slog.Any("err", err))
32+
return
33+
}
3034
if errors.Is(err, errs.ErrUnauthorized) {
3135
slog.Debug("未授权", slog.Any("err", err))
3236
ctx.AbortWithStatus(http.StatusUnauthorized)
@@ -49,6 +53,10 @@ func B[Req any](fn func(ctx *Context, req Req) (Result, error)) gin.HandlerFunc
4953
return
5054
}
5155
res, err := fn(&Context{Context: ctx}, req)
56+
if errors.Is(err, ErrNoResponse) {
57+
slog.Debug("不需要响应", slog.Any("err", err))
58+
return
59+
}
5260
if errors.Is(err, errs.ErrUnauthorized) {
5361
slog.Debug("未授权", slog.Any("err", err))
5462
ctx.AbortWithStatus(http.StatusUnauthorized)
@@ -80,6 +88,10 @@ func BS[Req any](fn func(ctx *Context, req Req, sess session.Session) (Result, e
8088
return
8189
}
8290
res, err := fn(gtx, req, sess)
91+
if errors.Is(err, ErrNoResponse) {
92+
slog.Debug("不需要响应", slog.Any("err", err))
93+
return
94+
}
8395
// 如果里面有权限校验,那么会返回 401 错误(目前来看,主要是登录态校验)
8496
if errors.Is(err, errs.ErrUnauthorized) {
8597
slog.Debug("未授权", slog.Any("err", err))
@@ -106,6 +118,10 @@ func S(fn func(ctx *Context, sess session.Session) (Result, error)) gin.HandlerF
106118
return
107119
}
108120
res, err := fn(gtx, sess)
121+
if errors.Is(err, ErrNoResponse) {
122+
slog.Debug("不需要响应", slog.Any("err", err))
123+
return
124+
}
109125
// 如果里面有权限校验,那么会返回 401 错误(目前来看,主要是登录态校验)
110126
if errors.Is(err, errs.ErrUnauthorized) {
111127
slog.Debug("未授权", slog.Any("err", err))

0 commit comments

Comments
 (0)