Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 从URL下载多个图像,并从aws lambda(nodejs)上传到aws s3_Node.js_Amazon Web Services_Amazon S3_Aws Lambda_Async Await - Fatal编程技术网

Node.js 从URL下载多个图像,并从aws lambda(nodejs)上传到aws s3

Node.js 从URL下载多个图像,并从aws lambda(nodejs)上传到aws s3,node.js,amazon-web-services,amazon-s3,aws-lambda,async-await,Node.js,Amazon Web Services,Amazon S3,Aws Lambda,Async Await,我可以使用此代码将单个图像上传到s3。当我尝试多个时,只上载第一个项目,lambda停止执行。我是javascript新手,所以我不理解这里的问题 async function downloadImage(url) { var options = { uri: url, encoding: null }; await new Promise((resolve, reject) => { request(options, functio

我可以使用此代码将单个图像上传到s3。当我尝试多个时,只上载第一个项目,lambda停止执行。我是javascript新手,所以我不理解这里的问题

async function downloadImage(url) {
  var options = {
        uri: url,
        encoding: null
    };
  await new Promise((resolve, reject) => {
    request(options, function(error, response, body) {
        if (error || response.statusCode !== 200) { 
            console.log("failed to get image");
            console.log(error);
        } else {
            s3.putObject({
                Body: body,
                Key: 'template/'+url.split('/').pop(),
                Bucket: bucketName
            }, function(error, data) { 
                if (error) {
                    console.log("error downloading image to s3");
                } else {
                    console.log("success uploading to s3");
                }
            }); 
        }   
    });
  })
  .catch((error) => {
    console.log("error");
  });
}

exports.handler = async (event, _ctx, _cb) => {
  var images = {
    banner: "http://media.com/strip.png",
    icon: "http://media.com/icon.png",
    logo: "http://media.com/logo.png"
  }
  
  for (const [key, value] of Object.entries(images)) {
    console.log(`${key}: ${value}`);
    await downloadImage(value);
  }
}
我从lambda获得的输出:

2020-10-03T19:11:32.293Z    3cd401a6-08c6-49a2-b01c-99d6430ffc1a    INFO    banner: http://media.com/circle/strip.png
2020-10-03T19:11:33.201Z    3cd401a6-08c6-49a2-b01c-99d6430ffc1a    INFO    success uploading to s3

不要在downloadImage函数中使用async并等待,因为您已经在处理程序中使用了它,并且在console.log(“成功上载到s3”)之后使用了它;写一份报税表;可能是lambda的超时…@Rolstan D'souza当我删除异步并在下载函数中等待时,lambda输出所有三个图像键和对象,但没有将任何图像上载到s3或显示成功message@DerekMenénedez lambda在900ms后停止执行,但超时时间设置为3分钟谢谢您的解决方案。它起作用了!请你解释一下这是怎么回事,或者我做错了什么?谢谢,不客气!您的
下载图像
是一个非常糟糕的解决方案。此外,您在其中没有resolve/reject/return。所以它不能正常工作。循环不能转到下一个迭代。如果答案有用,请将其标记为有用。谢谢。对不起,我没有足够的声誉来标记这个答案是有用的。没问题!别担心!一种更典型的方法是映射到images数组,并在结果承诺数组上等待Promise.all()。
const downloadImage = async url => {
  const options = {
    uri: url,
    encoding: null
  };
  const image = await requestPromise(options);
  await uploadToS3(image, url);
  return 'Uploaded'
}

const requestPromise = options => {
  return new Promise((resolve, reject) => {
    request(options, (error, response, body) => {
      if (error || response.statusCode !== 200) {
        console.log("failed to get image: ", error);
        return reject(error);
      }
      resolve(body);
    })
  })
}

const uploadToS3 = (body, url) => {
  return new Promise((resolve, reject) => {
    s3.putObject({
      Body: body,
      Key: 'template/' + url.split('/').pop(),
      Bucket: bucketName
    }, (err, data) => {
      if (err) {
        console.log("error downloading image to s3", err);
        return reject(err)
      };
      resolve(data);
    });
  })
}

exports.handler = async (event, _ctx, _cb) => {
  try {
    const images = {
      banner: "http://media.com/strip.png",
      icon: "http://media.com/icon.png",
      logo: "http://media.com/logo.png"
    }
    for (const [key, value] of Object.entries(images)) {
      console.log(`${key}: ${value}`);
      await downloadImage(value);
    }
  } catch (error) {
    console.log('Error in handler: ', error);
    return error
  }

}