javascript - AWS Lambda 在执行在 s3 存储桶中保存多个文件的 forEach 循环后返回 'null'

标签 javascript node.js amazon-s3 aws-lambda aws-sdk

我有一个 AWS Lambda 函数。它遍历数组列表(即 URL 数组)并保存屏幕截图并将它们放入 s3 中。如何返回此函数的输出(即 ScreenshotLinks 数组,其中包含 s3 中保存的文件的所有链接)?我最后使用了回调函数,但是它只是返回null!我希望回调函数输出保存在 ScreenshotLinks 数组中的所有 s3 文件链接。

exports.handler = (event, context, callback) => {

desktopLinks.forEach(function (url, index) {
      https.request(url, function(res) {
        var data = new Stream();
        res.on('data', function(chunk) {
          // Agregates chunks
          data.push(chunk);

        });

        res.on('end', function() {
          var body = data.read();
          // Once you received all chunks, send to S3
          var currentLink = links[index];
          var linkAddress = encodeURIComponent(currentLink);
          var slashPosition = getPosition(currentLink, '/', 3)+1;
          var linkName = currentLink.substr(slashPosition, currentLink.length)
          var params = {
            Bucket: bucket,
            Key: completeDate + '/screenshots/' + linkName + '.png',
            Body: body
          };
          s3.putObject(params, function(err, data, callback) {
            if (err) {
              console.error(err, err.stack);
            } else {
              bunch = params.Bucket + '/' + params.Key;
              screenshotLinks.push(bunch);
            }
          });
        });
        
      }).end();
     
  })
  callback(null, screenshotLinks)
};

最佳答案

您的代码是事件驱动/异步的,这意味着您在填充 ScreenshotLinks 之前调用回调。

Node http.ClientRequest.end()方法完成发送请求,但这并不意味着已接收并处理响应,因为这是由异步事件处理程序完成的。但是,回调是在调用 request.end() 之后立即执行的,也就是在请求被触发之后,因此 ScreenshotLinks 为空。

您需要从传递给 s3.putObject 的回调中执行回调。我建议您向回调传递一个响应/结果对象,该对象指示 putObject 是否成功并包含与其相关的 url 以及错误消息或屏幕截图链接,例如像这样的东西:

      s3.putObject(params, function(err, data, callback) {
        var s3Response;
        s3Response.url = url;
        if (err) {
          s3Response.success = false;
          s3Response.error = err;
          console.error(err, err.stack);
        } else {
          bunch = params.Bucket + '/' + params.Key;
          s3Response.success = true;
          s3Response.screenshotLink = bunch;
        }
        callback(null, s3Response);
      });

关于javascript - AWS Lambda 在执行在 s3 存储桶中保存多个文件的 forEach 循环后返回 'null',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52492475/

相关文章:

javascript - d3.js 中饼图调整大小的过渡

javascript - 淡化 div 的背景图像及其中的文本

amazon-web-services - 如何使MSCK修复表在AWS Athena中自动执行

java - 通过一次操作下载 S3 对象

amazon-web-services - 在 AWS 机器学习中创建数据源

javascript - 获取 crossfilter.js 错误 "too much recursion"

javascript - 如何在 HTML Canvas 中居中对齐文本?

javascript - JSON stringify 将 0 转换为 null

javascript - Mongoose/MongoDB - 引用另一个没有 ObjectId 的模式

javascript - Electron - 从菜单打开文件