Как правильно увеличить контекст - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь создать в Lambda промежуточное программное обеспечение для аутентификации, которое в основном внедряет свойство user в структуру ctx и вызывает функцию-обработчик. Как у меня дела:

промежуточное программное / 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)

Заранее спасибо.

1 Ответ

0 голосов
/ 31 октября 2018

Вы не можете получить доступ к значениям, добавленным в контекст напрямую, вам нужно использовать 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
}

Значение возвращает интерфейс, поэтому вам нужно использовать утверждение типа.

Примечание: использование простых строк в качестве ключей в контексте не рекомендуется, так как это может привести к конфликту ключей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...