为什么我的 lambda 函数没有按预期工作?

Red*_*ron 3 amazon-s3 amazon-web-services node.js aws-lambda

我从 lambda 收到此错误: errorType":"Runtime.UnhandledPromiseRejection","errorMessage":"Error: Unable to stringify response body

我正在尝试从 s3 中的上传触发我的 lambda(这部分正在工作),然后应该将一些内容发布到 dynamoDB

这是我的 lambda 完整版

var AWS = require('aws-sdk');
var S3 = require('aws-sdk/clients/s3');

const s3 = new AWS.S3()
var DynamoDB = new AWS.DynamoDB.DocumentClient();

exports.handler = async (event) => {
    // TODO implement
    var bucket = event['Records'][0]['s3']['bucket']['name']
    var json_file_name = event['Records'][0]['s3']['object']['key']
    var params = {
      Bucket: bucket, 
      Key: json_file_name
     };

    const data = await s3.getObject(params).promise();

    const dataToDb = data.Body.toString('utf-8');

    console.log(dataToDb, 'TESTING ====')

    var dbparams = {
        TableName: "MY-TABLE-NAME",
        Item: dataToDb, 
    };

    const putIntoDB = await DynamoDB.put(dbparams, function (err) {
         if (err) {
             console.log(err, 'er===');
         }
        else {
            console.log(dbparams, 'db====')
        }
    });

    return putIntoDB
};
Run Code Online (Sandbox Code Playgroud)

来自 s3 的数据只是一个简单的 json 对象,有 4 个键,所以没什么大不了的。我的表只包含一个主键user_id,该字段在我的 json 对象中是从 S3 返回的,所以不知道为什么这不起作用?

Tha*_*ssi 7

DynamoDB.put是一个回调,您正在尝试await使用它,因此这永远不会起作用。您应该.promise()s3.getObject调用调用一样链接方法。

await DynamoDB.put(dbparams).promise()

如果要处理错误,只需将其包装在一个try/catch块中:

try {
    await DynamoDB.put(dbparams).promise()
} catch (e) {
    console.log(e)
}
Run Code Online (Sandbox Code Playgroud)

最重要的是,您还需要Item使用 JSON 对象而不是字符串来提供DynamoDB 调用的属性。

我不确定您从 s3 中得到了什么,但是通过使用JSON.parse(dataToDb)将其转换为 JSON 对象应该可以解决问题,因为数据是有效的 JSON 对象。