所以,我正在撞墙,试图找出世界上我在这里做错了什么。我正在使用NodeJS 6.10编写Lambda函数。该函数应该从我的一个S3存储桶中检索多个图像并进行处理。我正在接受JavaScript的异步特性,或者尝试,无论如何,并允许它们同时发生,然后在所有这些完成之后等待并做一些事情。我已将这里的代码提炼到我能写的最低限度,并且仍能重现我所看到的问题。问题是没有任何图像被检索 - 事实上,没有迹象表明Lambda函数实际上试图检索它们,并且没有迹象表明回调被触发。
以下是代码:
console.log('Executing testImg method.');
var aws = require('aws-sdk');
var s3 = new aws.S3();
var imgData = {};
exports.handler = function(event, context, callback) {
var imgs = ['img_1', 'img_2', 'img_3', 'img_4', 'img_5', 'img_6', 'img_7', 'img_8'];
var imgPromises = [];
console.log('Grabbing images: ' + imgs);
imgs.forEach(function(img) {
console.log(img);
var myPromise = s3.getObject({
Bucket: 'photoBucket',
Key: 'images/' + img + '.png'
}).promise();
imgPromises.push(myPromise);
myPromise.then(function(result) {
console.log('Got ' + img);
imgData[img] = result.Body;
});
});
Promise.all(imgPromises).then(function() {
console.log(imgData);
context.succeed();
});
}
以下是Lambda的输出:
START RequestId: <UUID> Version: $LATEST
2017-05-21T18:53:31.187Z <UUID> Grabbing images: img_1,img_2,img_3,img_4,img_5,img_6,img_7,img_8
2017-05-21T18:53:31.187Z <UUID> img_1
2017-05-21T18:53:31.625Z <UUID> img_2
2017-05-21T18:53:31.648Z <UUID> img_3
2017-05-21T18:53:31.706Z <UUID> img_4
2017-05-21T18:53:31.707Z <UUID> img_5
2017-05-21T18:53:31.708Z <UUID> img_6
2017-05-21T18:53:31.766Z <UUID> img_7
2017-05-21T18:53:31.767Z <UUID> img_8
END RequestId: <UUID>
REPORT RequestId: <UUID> Duration: 10002.24 ms Billed Duration: 10000 ms Memory Size: 128 MB Max Memory Used: 80 MB
2017-05-21T18:53:41.173Z <UUID> Task timed out after 10.00 seconds
从输出中可以看出,console.log(img)行会在打印出图像名称的位置运行。但是,单个.then()块中的代码都没有运行(例如console.log('Got'+ img)),并且最终Promise.all块中的所有代码都没有运行(打印出整个数组) ,并调用success函数来终止函数。
另外,我尝试过其他一些事情:
我可以把它们连在一起,这样它们每个都可以同步发生,但是1)很难以动态的方式做到这一点(不知道我需要提前获得的文件数量),以及2这似乎违背了Async JS目前所做的一切。
任何提示都将不胜感激。
答案 0 :(得分:0)
好的,所以,Mark B关于S3需要访问公共互联网资源的评论是现场,以下是三种可能的解决方案:
再次感谢马克,为了正确方向的推动。