Node.js 从URL下载多个图像,并从aws lambda(nodejs)上传到aws s3
我可以使用此代码将单个图像上传到s3。当我尝试多个时,只上载第一个项目,lambda停止执行。我是javascript新手,所以我不理解这里的问题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
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
}
}