Я написал следующую функцию для лямбды для чтения изображений из корзины 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 };