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 S3API中没有任何内容';s getObject回调正在Lambda函数中运行_Node.js_Amazon S3_Aws Lambda_Aws Sdk - Fatal编程技术网

Node.js S3API中没有任何内容';s getObject回调正在Lambda函数中运行

Node.js S3API中没有任何内容';s getObject回调正在Lambda函数中运行,node.js,amazon-s3,aws-lambda,aws-sdk,Node.js,Amazon S3,Aws Lambda,Aws Sdk,我有一个问题,我无法从S3读取我的文件。。。甚至进入S3回调。我在lambda中使用node 8.10,在尝试进入getObject之前,我已经验证了一切都在运行——下面的控制台.log甚至不会运行。这里有什么东西看起来歪吗?我已经授予对lambda和S3的完全访问权限,所以我认为这不是问题所在 const AWS = require('aws-sdk') exports.handler = async (event, context, callback) => { const

我有一个问题,我无法从S3读取我的文件。。。甚至进入S3回调。我在lambda中使用node 8.10,在尝试进入getObject之前,我已经验证了一切都在运行——下面的
控制台.log
甚至不会运行。这里有什么东西看起来歪吗?我已经授予对lambda和S3的完全访问权限,所以我认为这不是问题所在

const AWS = require('aws-sdk')

exports.handler = async (event, context, callback) => {

    const s3options = {
        accessKeyId: process.env.AWS_KEY,
        secretAccessKey: process.env.AWS_SECRET,
        apiVersion: '2006-03-01',
    }   

    const params = {
        Bucket: event.Records[0].s3.bucket.name,
        Key: event.Records[0].s3.object.key,
    }

    const s3 = new AWS.S3(s3options)    

    s3.getObject(params, (err, data) => {
        // callback(null, data.Body.toString('utf-8'))

        console.log('I am here!')
    })

}
如果您试图使用Node v8.x的async/await功能,那么您必须将代码包装到try/catch块中,并使用承诺(我的意思是不需要包装函数代码,但您仍然必须在应用程序中实现try/catch块)

注意:AWS-SDK已承诺,表示您没有承诺AWS-SDK方法或使用回调。只需简单地将.promise()作为尾部附加到您的方法中,并将wait关键字作为前缀添加到您试图调用的方法中

例如:

之前:

s3.getObject(params, (err, data) => {
        // callback(null, data.Body.toString('utf-8'))
之后:

try 
{
    const s3Response = await s3.getObject(params).promise();

    // if succeed 
    // handle response here
}
catch (ex) 
{
    // if failed
    // handle response here (obv: ex object)
    // you can simply use logging
    console.error(ex);
}
那么您的代码必须如下所示:

// it's really cool to use ES6 syntax to import modules: import * as AWS from 'aws-sdk';
// btw, you don't have to import AWS-SDK inside the handler file

// const AWS = require('aws-sdk')

exports.handler = async (event) => {

    const s3options = 
    {
        accessKeyId: process.env.AWS_KEY,
        secretAccessKey: process.env.AWS_SECRET,
        apiVersion: '2006-03-01',
        // do not forget include a region (e.g. { region: 'us-west-1' })
    }   

    const params = 
    {
        Bucket: event.Records[0].s3.bucket.name,
        Key: event.Records[0].s3.object.key,
    }

    const s3 = new AWS.S3(s3options)    

    try 
    {
        const s3Response = await s3.getObject(params).promise();

        // if succeed 
        // handle response here
    }
    catch (ex) 
    {
        // if failed
        // handle response here (obv: ex object)
        // you can simply use logging
        console.error(ex);
    }
}

异步函数需要返回一个承诺,不是吗?Lambda不知道你还没做完我觉得自己像个工具。删除了“async”关键字,一切正常。谢谢这就是我最终解决问题的原因。在我学习promise()方法的过程中,我做了如上所述的调整,我的异步lambda工作得很好。非常感谢。