Rumah > pembangunan bahagian belakang > Golang > aws lambda dalam golang dicetuskan oleh persegi dengan ralat jenis

aws lambda dalam golang dicetuskan oleh persegi dengan ralat jenis

PHPz
Lepaskan: 2024-02-09 13:46:13
ke hadapan
818 orang telah melayarinya

golang中的aws lambda由sqs触发并出现类型错误

editor php Baicao membawakan anda soalan kali ini tentang AWS Lambda di golang. Apabila mencetuskan fungsi Lambda menggunakan AWS SQS, ralat jenis mungkin berlaku. Masalah ini mungkin menyebabkan fungsi Lambda tidak dapat memproses mesej SQS secara normal, menyebabkan masalah yang tidak perlu kepada pembangun. Dalam artikel ini, kami akan meneroka punca masalah ini dan menyediakan penyelesaian untuk membantu pembangun berjaya menyelesaikan dilema ralat jenis ini.

Kandungan soalan

Saya sedang membangunkan lambda yang dicetuskan oleh get laluan api dan persegi.

package main

import (
    "context"
    "fmt"
    "log"

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

    regcode "company/gateway/lambda/regcode/lib"
)

func main() {

    // start the lambda function with both sqs and lambda url handlers
    lambda.start(func(ctx context.context, event interface{}) error {
        fmt.println("event type: ", event)
        switch event.(type) {
        case events.sqsevent:
            return regcode.handlersqs(ctx, event.(events.sqsevent))
        case events.apigatewayproxyrequest:
            response, err := regcode.handlerlambdaurl(ctx, event.(events.apigatewayproxyrequest))
            if err != nil {
                log.println(err)
                return err
            }
            log.printf("api gateway response: %v", response)
            return nil
        default:
            return fmt.errorf("unknown event type: %t", event)
        }
    })
}
Salin selepas log masuk

Tetapi jenis suis saya tidak mengecam apabila menggunakan acara persegi atau apigateway. Ia sentiasa tergolong dalam pernyataan lalai. Sebagai contoh, untuk persegi saya menggunakan acara ini:

{
  "records": [
    {
      "messageid": "19dd0b57-b21e-4ac1-bd88-01bbb068cb78",
      "receipthandle": "messagereceipthandle",
      "body": "hello from sqs!",
      "attributes": {
        "approximatereceivecount": "1",
        "senttimestamp": "1523232000000",
        "senderid": "123456789012",
        "approximatefirstreceivetimestamp": "1523232000001"
      },
      "messageattributes": {},
      "md5ofbody": "{{{md5_of_body}}}",
      "md5ofmessageattributes": "test",
      "eventsource": "aws:sqs",
      "eventsourcearn": "arn:aws:sqs:us-east-1:123456789012:myqueue",
      "awsregion": "us-east-1"
    }
  ]
}
Salin selepas log masuk

dan menerima mesej ini:

unknown event type: map[string]interface {}: errorstring
Salin selepas log masuk

Ada idea apa yang saya buat salah? Saya baru guna golang jadi saya sesat di sini.

Selain itu, saya cuba menghantar acara terus ke regcode.handlersqs tetapi saya mendapat ralat penukaran jenis. Seperti ini:

func main() {

    // Start the Lambda function with both SQS and Lambda URL handlers
    lambda.Start(func(ctx context.Context, event interface{}) error {
        sqsEvent, _ := event.(SQSEvent)
        // ...
    })
}
Salin selepas log masuk

sqsevent kosong.

Penyelesaian

Ada idea apa yang saya buat salah?

Pengendali lambda AWS akan mencerminkan func 中参数的类型,然后创建与您的签名匹配的 event jenis.

Jadi, jika anda func 的第二个参数声明为 event events.SQSEvent,AWS 将获取其类型 events.SQSEvent, cipta objek seperti ini dan serahkannya.

Begitu juga, jika anda func 中使用 event events.APIGatewayProxyRequest,AWS 将反映 event 应该是 events.APIGatewayProxyRequest dan menciptanya.

Dalam erti kata lain, AWS tidak menyemak sama ada permintaan masuk datang daripada SQS atau API. Ini hanya ditentukan berdasarkan tandatangan pengendali anda. Jadi jika anda berada di func 中使用 event 接口{},AWS 将准确创建您指定要创建的内容,即 interface{} dan bukan jenis lain.

Inilah sebab suis anda tidak berfungsi. Cara paling mudah untuk menyelesaikan masalah ini ialah menggunakan dua fungsi lambda, satu untuk SQS dan satu untuk API.

Atas ialah kandungan terperinci aws lambda dalam golang dicetuskan oleh persegi dengan ralat jenis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan