node.js - 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 };
解决方案
推荐阅读
- android - 如何在android的底部导航栏中获取linkedin类型的图标?
- python - 为什么我不能在 1 个数据帧中获得所有循环数据帧?
- swift - 如何通过 WKWebView 在应用程序购买中使用 Apple
- c - 如何通过C中的共享内存将文件发送到另一个进程
- flutter - flutter:: 有没有一个flutter包可以让我直观地看到我的音量?
- android - 使用 Visual Studio Code 作为移动开发 IDE,通过安装 Android 命令工具
- android - 在 Kotlin 中更改 TextView 的文本时出错 - Android
- java - 如何在 twitter4j 中将 twitter ID 转换为用户名?或者我可以使用 id 来获取用户简介吗?
- javascript - 使用 Server-Sent Event 获取在线用户
- c# - 如何创建新列表
基于另外两个列表 并考虑重复?