Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services Go AWS Lambda返回[]*bytes.Buffer作为空对象的片[{}]_Amazon Web Services_Go_Aws Lambda - Fatal编程技术网

Amazon web services Go AWS Lambda返回[]*bytes.Buffer作为空对象的片[{}]

Amazon web services Go AWS Lambda返回[]*bytes.Buffer作为空对象的片[{}],amazon-web-services,go,aws-lambda,Amazon Web Services,Go,Aws Lambda,我正在开发一个step函数,它处理一些文件,将它们上传到S3(Lambda),并将处理过的文件传递给另一个Lambda(Lambda B),后者将处理这些数据,并执行其他不相关的操作 从lambda中,我返回一个具有字符串字段和[]*bytes.Buffer的结构。问题是当Lambda完成时,缓冲区数组总是空的。我在代码的某些部分添加了一些fmt.Println命令,我意识到logic.go实现方法正确地填充了这个数组 如何将文件内容作为缓冲区的一部分返回 我尝试了很多不同的方法试图弄清楚发生了

我正在开发一个step函数,它处理一些文件,将它们上传到S3(Lambda),并将处理过的文件传递给另一个Lambda(Lambda B),后者将处理这些数据,并执行其他不相关的操作

从lambda中,我返回一个具有字符串字段和[]*bytes.Buffer的结构。问题是当Lambda完成时,缓冲区数组总是空的。我在代码的某些部分添加了一些fmt.Println命令,我意识到logic.go实现方法正确地填充了这个数组

如何将文件内容作为缓冲区的一部分返回

我尝试了很多不同的方法试图弄清楚发生了什么,但我认为这是lambda处理器的问题

逻辑。开始

func (srv transferFileService) TransferFiles() ([]*bytes.Buffer, error) {
    bufferArray := []*bytes.Buffer{}
    dir, err := srv.sftpService.CurrentDirectory()
    if err != nil {
        srv.lgr.Fatal("error get  CurrentDirectory", err)
        return nil, err
    }

    files, err := srv.sftpService.ReadDir(dir)
    if err != nil {
        srv.lgr.Fatal("error ReadDir ", err)
        return nil, err
    }
    defer srv.sftpService.Close()

    for _, f := range files {
        if f.IsDir() == true {
            continue
        }
        srcFile, err := srv.sftpService.Open(f.Name())
        if err != nil {
            log.Fatal("error client open")
            srv.lgr.Error("error client open", err)
            return nil, err
        }
        defer srcFile.Close()

        bytesReaded, err := ioutil.ReadAll(srcFile)
        bytesBuffer := bytes.NewBuffer(bytesReaded)

        if err != nil {
            fmt.Println("error Copy", err)
            return nil, err
        }

        _, err = srv.s3manager.PutObject(srv.bucketName, f.Name(), srcFile)
        if err != nil {
            fmt.Println("error put object S3", err)
            return nil, err
        }

        bufferArray = append(bufferArray, bytesBuffer)
    }
    fmt.Println("bufferArray", bufferArray)
    return bufferArray, nil
}
//Handler aws handler method
func (hs handlerService) Handler() (*model.Response, error) {
    bytesReaded, err := hs.transferFileSrv.TransferFiles()
    if err != nil {
        return nil, err
    }

    return &model.Response{
        Files: bytesReaded,
        Title: "aaa",
    }, nil
}
package model

import "bytes"

type Response struct {
    Files []*bytes.Buffer
    Title string
}

handler.go

func (srv transferFileService) TransferFiles() ([]*bytes.Buffer, error) {
    bufferArray := []*bytes.Buffer{}
    dir, err := srv.sftpService.CurrentDirectory()
    if err != nil {
        srv.lgr.Fatal("error get  CurrentDirectory", err)
        return nil, err
    }

    files, err := srv.sftpService.ReadDir(dir)
    if err != nil {
        srv.lgr.Fatal("error ReadDir ", err)
        return nil, err
    }
    defer srv.sftpService.Close()

    for _, f := range files {
        if f.IsDir() == true {
            continue
        }
        srcFile, err := srv.sftpService.Open(f.Name())
        if err != nil {
            log.Fatal("error client open")
            srv.lgr.Error("error client open", err)
            return nil, err
        }
        defer srcFile.Close()

        bytesReaded, err := ioutil.ReadAll(srcFile)
        bytesBuffer := bytes.NewBuffer(bytesReaded)

        if err != nil {
            fmt.Println("error Copy", err)
            return nil, err
        }

        _, err = srv.s3manager.PutObject(srv.bucketName, f.Name(), srcFile)
        if err != nil {
            fmt.Println("error put object S3", err)
            return nil, err
        }

        bufferArray = append(bufferArray, bytesBuffer)
    }
    fmt.Println("bufferArray", bufferArray)
    return bufferArray, nil
}
//Handler aws handler method
func (hs handlerService) Handler() (*model.Response, error) {
    bytesReaded, err := hs.transferFileSrv.TransferFiles()
    if err != nil {
        return nil, err
    }

    return &model.Response{
        Files: bytesReaded,
        Title: "aaa",
    }, nil
}
package model

import "bytes"

type Response struct {
    Files []*bytes.Buffer
    Title string
}

型号。开始

func (srv transferFileService) TransferFiles() ([]*bytes.Buffer, error) {
    bufferArray := []*bytes.Buffer{}
    dir, err := srv.sftpService.CurrentDirectory()
    if err != nil {
        srv.lgr.Fatal("error get  CurrentDirectory", err)
        return nil, err
    }

    files, err := srv.sftpService.ReadDir(dir)
    if err != nil {
        srv.lgr.Fatal("error ReadDir ", err)
        return nil, err
    }
    defer srv.sftpService.Close()

    for _, f := range files {
        if f.IsDir() == true {
            continue
        }
        srcFile, err := srv.sftpService.Open(f.Name())
        if err != nil {
            log.Fatal("error client open")
            srv.lgr.Error("error client open", err)
            return nil, err
        }
        defer srcFile.Close()

        bytesReaded, err := ioutil.ReadAll(srcFile)
        bytesBuffer := bytes.NewBuffer(bytesReaded)

        if err != nil {
            fmt.Println("error Copy", err)
            return nil, err
        }

        _, err = srv.s3manager.PutObject(srv.bucketName, f.Name(), srcFile)
        if err != nil {
            fmt.Println("error put object S3", err)
            return nil, err
        }

        bufferArray = append(bufferArray, bytesBuffer)
    }
    fmt.Println("bufferArray", bufferArray)
    return bufferArray, nil
}
//Handler aws handler method
func (hs handlerService) Handler() (*model.Response, error) {
    bytesReaded, err := hs.transferFileSrv.TransferFiles()
    if err != nil {
        return nil, err
    }

    return &model.Response{
        Files: bytesReaded,
        Title: "aaa",
    }, nil
}
package model

import "bytes"

type Response struct {
    Files []*bytes.Buffer
    Title string
}

当我的logic.go方法完成后,将打印数组值。正如您所看到的,当lambda完成并返回值时,数组为空

START RequestId: fb057c9d-a4bf-1d7b-6172-4b541c3adb2c Version: $LATEST
bufferArray [78007840120050671420200505000000001]
END RequestId: fb057c9d-a4bf-1d7b-6172-4b541c3adb2c
REPORT RequestId: fb057c9d-a4bf-1d7b-6172-4b541c3adb2c  Init Duration: 7567.80 ms       Duration: 12049.72 ms   Billed Duration: 12100 ms       Memory Size: 128 MBMax Memory Used: 42 MB

{"Files":[{}],"Title":"aaa"}

我一直在搜索AWS lambda的官方文档。我发现这个链接说调用负载(请求和响应)在异步调用上有256kb的限制。我在这里没有看到任何试图将
字节.Buffer
序列化为json的内容。对于
字节。Buffer
,没有json表示,您希望它返回什么?我想在我的step函数中将此缓冲区数组传递给下一个lambda。我认为问题在于调用负载响应。为什么标题字段输出正确,而另一个字段输出不正确?
title
是一个
字符串,可以封送为json
*bytes.Buffer
是一种Go结构,它是有状态的,没有导出字段,封送到json没有任何意义。
Files
字段被输出,并且有一个值,恰好是一个空对象。谢谢您的回答。我想这是对我问题的回应,我做了一个变通办法,将s3密钥作为数组返回,下一个lambda负责从s3获取文件并处理itI,我一直在AWS lambda官方文档中搜索。我发现这个链接说调用负载(请求和响应)在异步调用上有256kb的限制。我在这里没有看到任何试图将
字节.Buffer
序列化为json的内容。对于
字节。Buffer
,没有json表示,您希望它返回什么?我想在我的step函数中将此缓冲区数组传递给下一个lambda。我认为问题在于调用负载响应。为什么标题字段输出正确,而另一个字段输出不正确?
title
是一个
字符串,可以封送为json
*bytes.Buffer
是一种Go结构,它是有状态的,没有导出字段,封送到json没有任何意义。
Files
字段被输出,并且有一个值,恰好是一个空对象。谢谢您的回答。我想这是对我的问题的回应,我做了一个变通方法,将s3键作为数组返回,下一个lambda负责从s3获取文件并处理它