【问题标题】:Why does AWS API Gateway websocket send error为什么 AWS API Gateway websocket 发送错误
【发布时间】:2019-12-19 10:43:02
【问题描述】:

我正在使用无服务器框架来设置 AWS API Gateway websocket,它调用用 Go 编写的 lambda 函数。现在处理程序只记录一条消息。我可以连接到 websocket,当我通过套接字发送消息时,我可以看到消息已记录在 Cloudwatch 中,但我总是收到一条看起来像

的错误消息
{
  "message": "Internal server error",
  "connectionId": "eU3C1cE7CYcCJPw=",
  "requestId": "eU3EQFX0iYcFysQ="
}

Cloudwatch 中没有记录 lambda 的错误。 AWS API Gateway 配置对我来说看起来不错。我不知道是什么原因造成的。

我的 main.go:

package main

import (
    "fmt"

    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
)

func Handler(request events.APIGatewayWebsocketProxyRequest) {
    fmt.Println("default function ran")
}

func main() {
    lambda.Start(Handler)
}

可能不是超级相关,但 serverless.yaml 配置:

functions:
  websocket-default:
    handler: bin/ws
    events:
      - websocket:
          route: $default

我要发送的有效载荷:

{
  "action": "whatever",
  "data":  "{whatever}"
}

【问题讨论】:

    标签: go websocket aws-lambda serverless-framework


    【解决方案1】:

    不确定这是否是您代码中的唯一问题,但您的处理程序签名应该是doc 中列出的一个:

    func ()
    func () error
    func (TIn) error
    func () (TOut, error)
    func (context.Context) error
    func (context.Context, TIn) error
    func (context.Context) (TOut, error)
    func (context.Context, TIn) (TOut, error)
    

    【讨论】:

    • 我的猜测也是方法签名,但我在 Go 中找不到 websocket 处理程序的示例。它确实运行并且填充了APIGatewayWebsocketProxyRequest
    • 开启了 API 的 Cloudwatch 日志记录,绝对是这个。谢谢。
    【解决方案2】:

    好吧,所以它需要大量的试验和错误,但这是有效的方法签名

    type Response events.APIGatewayProxyResponse
    
    func Handler(context context.Context, request events.APIGatewayWebsocketProxyRequest) (Response, error) 
    

    我真的希望 golang 的文档更好。感谢 Clement 为我指明了正确的方向。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-30
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      • 2020-05-21
      • 1970-01-01
      • 2015-10-21
      • 2018-09-23
      相关资源
      最近更新 更多