Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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 AWS Lambda使用s3 getObject函数无任何事件_Node.js_Amazon S3_Aws Lambda_Aws Sdk_Aws Sdk Js - Fatal编程技术网

Node.js AWS Lambda使用s3 getObject函数无任何事件

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

这是使用内联编辑器的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 ('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;
};