2 回答
TA贡献1828条经验 获得超3个赞
要使用您构建的内容,您必须使用类型断言:
rctx:=request.Context().(RequestContext)
如果您有一个以与您相同的方式包装上下文的中间件,这将中断。
另一种方法是使用基本上下文,并添加带有私钥的助手来访问值:
type reqKey int
const key reqKey=iota
type RequestData struct {
UserID uuid.UUID
Now time.Time
}
func ContextWithRequest(ctx context.Context,req requestData) context.Context {
return context.WithValue(ctx,key,req)
}
func GetRequest(ctx context) RequestData {
x:=ctx.Value(key)
if x!=nil {
return x.(RequestData)
}
return RequestData{}
}
当然,如果要更改RequestData,则需要添加指向上下文的指针。
TA贡献1841条经验 获得超3个赞
这就是我现在在我的应用程序中使用的。我使用简单的 settters 和 getter 从上下文中检索值。
import (
"context"
"github.com/google/uuid"
)
const userIdContextKey = "user_id" // type is uuid
func addUserIdToContext(ctx context.Context, user uuid.UUID) context.Context {
return context.WithValue(ctx, UserIdContextKey, user)
}
func userIDFromContext(ctx context.Context) uuid.UUID {
return ctx.Value(UserIdContextKey).(uuid.UUID)
}
然后在一个中间件中,我已经检索了 userId,我通过将上下文和用户 ID 传递给addUserIdToContext()函数来将值添加到上下文中。
ctx := addUserIdToContext(r.Context(), userId)
当我想从上下文中检索用户时,我只需要调用userIDFromContext(ctx)并将请求上下文传递给它。
func CreateResource(w http.ResponseWriter, r *http.Request) {
createdBy := userIDFromContext(r.Context())
// do something with createdBy
}
我知道这不是最优雅甚至类型安全的解决方案,但是,嘿,因为我正在尝试构建它,它工作得很好。
- 2 回答
- 0 关注
- 110 浏览
添加回答
举报