我有一个 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/