gpt4 book ai didi

go - 如何正确扩充语境

转载 作者:IT王子 更新时间:2023-10-29 02:08:29 26 4
gpt4 key购买 nike

我正在尝试在我的 Lambda 中创建一个身份验证中间件,它基本上是在 ctx 结构中注入(inject)一个属性 user,并调用处理程序函数。我在做什么:

middlewares/authentication.go:

package middlewares

import (
"context"

"github.com/aws/aws-lambda-go/events"
"github.com/passus/api/models"
)

func Authentication(next MiddlewareSignature) MiddlewareSignature {
user := models.User{}

return func(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
claims := request.RequestContext.Authorizer["claims"]

// Find user by claims properties.
if err := user.Current(claims); err != nil {
return events.APIGatewayProxyResponse{}, err
}

// Augment ctx with user property.
ctx = context.WithValue(ctx, "user", user)
return next(ctx, request)
}
}

我的 lambda.go:

package main

import (
"context"
"fmt"

"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
"github.com/passus/api/middlewares"
)

func Handler(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
fmt.Println(ctx.user)

return events.APIGatewayProxyResponse{}, nil
}

func main() {
lambda.Start(
middlewares.Authentication(Handler),
)
}

这种方法的问题在于:它不起作用。我在尝试构建它时看到以下错误:create/main.go:13:17: ctx.user undefined (type context.Context has no field or method user)

提前谢谢你。

最佳答案

您无法直接访问添加到上下文的值——您需要使用 Value(key interface{}) 接口(interface){} API。

这是因为添加到 Context 的任何值都必须是不可变的才能保证线程安全。对 Context 上现有值的任何更改都是通过创建新的 Context 来完成的。

这是更新后的 my-lambda.go:

func Handler(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
fmt.Println(ctx.value("user").(models.User))

return events.APIGatewayProxyResponse{}, nil
}

Value 返回一个接口(interface),所以你需要使用类型断言。

注意:不推荐使用纯字符串作为 Context 的键,因为这可能导致键冲突。

关于go - 如何正确扩充语境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53074659/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com