Функция forEach не ожидает возврата буфера на AWS лямбда - PullRequest
1 голос
/ 04 мая 2020

Я написал следующую функцию для лямбды для чтения изображений из корзины s3 и сжатия ее с различными вариантами воспроизведения. Представления хранятся как переменная окружения в лямбда-функции. Я читаю эти представления и преобразовываю их в массив, затем перебираю их. Во время итерации я пытаюсь сжать изображение, используя резкую библиотеку js с текущим элементом воспроизведения, который является ничем иным, как объектом JSON. forEach начинается со строки № 21, но, хотя он ожидает, он не ожидает выполнения кода ниже строки 42 и продолжения итерации оттуда. Таким образом, я получаю console.log («до места назначения»); выполняется трижды, но не фактические логи c. Когда я использую один и тот же код для одного элемента, он работает нормально.

Может ли кто-нибудь помочь мне здесь?



  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    };

...