Node.js AWS Lambda使用s3 getObject函数无任何事件
这是使用内联编辑器的node.js代码:Node.js AWS Lambda使用s3 getObject函数无任何事件,node.js,amazon-s3,aws-lambda,aws-sdk,aws-sdk-js,Node.js,Amazon S3,Aws Lambda,Aws Sdk,Aws Sdk Js,这是使用内联编辑器的node.js代码: const AWS = require('aws-sdk'); const s3 = new AWS.S3(); console.log('Loading function'); exports.handler = async (event) => { // TODO implement var responseMsg = ''; var bucket = ''; var key = ''; if ('R
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
console.log('Loading function');
exports.handler = async (event) => {
// TODO implement
var responseMsg = '';
var bucket = '';
var key = '';
if ('Records' in event) {
var s3Data = event.Records[0].s3;
console.log('s3Data: ' + JSON.stringify(s3Data));
bucket = s3Data.bucket.name;
key = s3Data.object.key;
}
console.log('Bucket:' + bucket);
console.log('Key:' + key);
var params = {
Bucket: bucket,
Key: key
};
console.log('Params:' + JSON.stringify(params));
s3.getObject(params, function (err, data) {
console.log('getObject');
if (err) {
console.log(err, err.stack);
return err;
}
responseMsg = data;
});
const response = {
statusCode: 200,
body: JSON.stringify(responseMsg),
};
return response;
};
我知道我正在测试的密钥和存储桶存在于我的S3控制台中。我知道我可以使用LINQPad中的C#访问它们
当我运行这个时,我没有得到任何错误。我在响应体中得到一个空字符串,而不是对象的内容。我也没有从s3.getObject中获得任何日志消息。对
s3.getObject的调用是一个异步调用。运行s3
代码时,代码继续执行。您需要明确地等待
,等待通话承诺的解决
这就是您应该如何做到的(注意s3.getObject
调用中的更改):
const AWS=require('AWS-sdk');
const s3=新的AWS.s3();
exports.handler=异步(事件)=>{
var params={
桶:,
关键字:,
};
const data=wait s3.getObject(params.promise();
常数响应={
状态代码:200,
正文:JSON.stringify(数据),
};
返回响应;
};
您可以使用try/catch
块进行错误处理
这里需要了解的重要一点是执行的时间安排。调用lambda时,函数中的主线代码将按顺序调用。传递给s3.getObject
调用的回调函数是在来自s3的响应到达时调用的,在lambda完成其执行之后很久
您的return
调用是在回调运行之前执行的,因此您会看到JSON.strigify(responseMsg)
的结果,其中responseMsg
保存您给它的初始值,这是空字符串'
如何处理lambda中的多个getobject请求。好的,所以我尝试使用forEach
循环键并调用getobject
,但它不起作用,因为它涉及回调函数。尽管simple for循环在执行多个getobject
调用并将其结果收集到ArrayEAH中起作用,但forEach
将不起作用(至少不是最简单的方法)。我要做的是使用Array.map()
生成承诺列表,并在生成的承诺列表上使用Promise.all()
。这个承诺。所有的我都试过了,但可能遗漏了一些东西,它也不起作用。我以后会再查的。谢谢
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
exports.handler = async (event) => {
var params = {
Bucket: <bucket>,
Key: <key>,
};
const data = await s3.getObject(params).promise();
const response = {
statusCode: 200,
body: JSON.stringify(data),
};
return response;
};