首页 > 解决方案 > forEach 函数不等待在 AWS lambda 上返回缓冲区

问题描述

我在 lambda 上编写了以下函数,用于从 s3 存储桶中读取图像并使用不同的格式对其进行压缩。演绎版作为环境变量存储在 lambda 函数中。我阅读了这些演绎版并将其转换为一个数组,然后遍历它。在迭代时,我正在尝试使用带有当前渲染元素的sharpjs库来压缩图像,该元素只不过是一个JSON对象。forEach 从第 21 行开始,但尽管它正在等待,但它不会等待第 42 行以下的代码执行并从那里继续迭代。所以我得到了 console.log("before destination bucket"); 执行三次但不是实际的逻辑。当我对单个元素使用相同的代码时,它工作正常。

有人可以帮我吗?



  1 const aws = require('aws-sdk');
2     const s3 = new aws.S3();
3     const sharp = require('sharp');
4     const { v4: uuidv4 } = require('uuid');
5     exports.handler = async (event) => {
6         let renditions = process.env.renditions;
7         const bucketName = event.Records[0].s3.bucket.name;
8         const fileName = event.Records[0].s3.object.key;
9         console.log(event.Records[0].s3.bucket.name);
10        console.log(event.Records[0].s3.object.key);
11        try {
12            let uuid = uuidv4();
13            const file = await s3
14                .getObject({ Bucket: bucketName, Key: fileName })
15                .promise();
16            console.log(file.Body);
17            const putAsItIs = await s3.putObject({ Bucket: "dev-originals", Key: uuidv4() + "/" + fileName, Body: file.Body }).promise();
18            console.log("putAsItIs" + putAsItIs.Body);
19            const deleted = await s3.deleteObject({ Bucket: bucketName, Key: fileName }).promise();
20            let renditionsArray = JSON.parse(renditions);
21            await  renditionsArray.forEach(async (rendition) => {
22            try {
23                console.log("forEach start");
24
25                try {
26                    console.log("rendition" + rendition);
27                    let path = uuid;
28                    if (rendition.name == "WebCompress") {
29                        path = path + "/WC";
30                    }
31                    if (rendition.name == "Thumbnail") {
32                        path = path + "/TN";
33                    }
34                    if (rendition.name == "WebPreview") {
35                        path = path + "/WP";
36                    }
37
38                    console.log("Before buffer" + rendition.width + rendition.quality);
39                    console.log("before distination bucket");
40                    // Upload the thumbnail image to the destination bucket
41
42                    let space = "srgb";
43                    var buffer = await sharp(file.Body).resize(rendition.width).withMetadata().toColorspace(space).webp({ quality: rendition.quality }).toBuffer();
44                    console.log("buffer" + buffer);
45                    try {
46                        const destparams = {
47                            Bucket: "dev-webcompressed",
48                            Key: path + "/" + fileName,
49                            Body: buffer,
50                            ContentType: "image"
51                        };
52                        const putResult = await s3.putObject(destparams).promise();
53                        console.log("putResult : " + putResult)
54                    } catch (error) {
55                        console.log(error);
56                        return;
57                    }
58                } catch (error) {
59                    console.log("Inner" + error);
60                }
61            }
62            catch (error) {
63                console.log("Inner" + error);
64            }
65
66            });
67        } catch (err) {
68            console.log("Outer" + err);
69        }
70
71        // TODO implement
72        const response = {
73            statusCode: 200,
74            body: JSON.stringify('Hello from Lambda!'),
75        };
76        return response;
77    };

标签: node.jsamazon-web-servicesaws-lambdaasync-await

解决方案


推荐阅读