解析负载与“无服务器调用本地”不同,与在 APIGateway 后面部署时不同

Adg*_*aza 3 go aws-lambda serverless

invoke local无服务器处理请求负载的方式与部署到 AWS 时的行为似乎有所不同。

预期的行为是您将从请求正文中提取有效负载,如下所示......

func Handler(ctx context.Context, request events.APIGatewayProxyRequest)
Run Code Online (Sandbox Code Playgroud)

然后将其解组为您的数据类型,如下所示......

type SearchQuery struct {
    Caller string `json:"caller"`
    Value  string `json:"value"`
}
Run Code Online (Sandbox Code Playgroud)
err := json.Unmarshal([]byte(request.Body), &searchQuery)
Run Code Online (Sandbox Code Playgroud)

但是,当使用该--data标志在本地调用该函数时,有效负载不在request.Body.

events.APIGatewayProxyRequest) {
 Resource: (string) "",
 Path: (string) "",
 HTTPMethod: (string) "",
 Headers: (map[string]string) <nil>,
 MultiValueHeaders: (map[string][]string) <nil>,
 QueryStringParameters: (map[string]string) <nil>,
 MultiValueQueryStringParameters: (map[string][]string) <nil>,
 PathParameters: (map[string]string) <nil>,
 StageVariables: (map[string]string) <nil>,
 RequestContext: (events.APIGatewayProxyRequestContext) {
  AccountID: (string) "",
  ResourceID: (string) "",
  Stage: (string) "",
  RequestID: (string) "",
  Identity: (events.APIGatewayRequestIdentity) {
   CognitoIdentityPoolID: (string) "",
   AccountID: (string) "",
   CognitoIdentityID: (string) "",
   Caller: (string) "",
   APIKey: (string) "",
   AccessKey: (string) "",
   SourceIP: (string) "",
   CognitoAuthenticationType: (string) "",
   CognitoAuthenticationProvider: (string) "",
   UserArn: (string) "",
   UserAgent: (string) "",
   User: (string) ""
  },
  ResourcePath: (string) "",
  Authorizer: (map[string]interface {}) <nil>,
  HTTPMethod: (string) "",
  APIID: (string) ""
 },
 Body: (string) "",
 IsBase64Encoded: (bool) false
}
Run Code Online (Sandbox Code Playgroud)

仅当您使用数据类型作为请求参数时才能提取它,如下所示......

func Handler(ctx context.Context, request SearchQuery) (Response, error)
Run Code Online (Sandbox Code Playgroud)

有没有办法让这两个环境同样工作?

Adg*_*aza 5

我通过使用--patharg 而不是--dataarg 并像这样写出有效负载来实现此目的。

serverless invoke local -f myfunc --log --path mydata.json

{
    "body": "{\"caller\": \"foo\", \"value\": \"clark.kent@example.com\"}"
}
Run Code Online (Sandbox Code Playgroud)