我试图在我的 Lambda 中创建一个身份验证中间件,它基本上在结构user中注入一个属性ctx,并调用处理函数。我是怎么做的:中间件/authentication.go:package middlewaresimport ( "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 mainimport ( "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)先感谢您。
1 回答
郎朗坤
TA贡献1921条经验 获得超9个赞
您无法直接访问添加到上下文的值——您需要使用Value(key interface{}) interface{}API。
这是因为添加到 a 的任何值都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
}
值返回一个接口,所以你需要使用类型断言。
注意:不推荐使用纯字符串作为 Context 的键,因为这可能导致键冲突。
- 1 回答
- 0 关注
- 97 浏览
添加回答
举报
0/150
提交
取消