为什么我的lambda函数无法正常工作?

时间:2019-10-25 06:07:10

标签: node.js amazon-web-services amazon-s3 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
};

来自s3的数据只是一个具有4个键的简单json对象,因此一点也不大。 我的表仅包含一个名为user_id的主键,并且该字段位于我的json对象中,该字段是从S3返回的,所以不知道为什么它不起作用?

2 个答案:

答案 0 :(得分:2)

DynamoDB.put是一个回调,您正在尝试在其上await,所以它将永远无法使用。您应该像.promise()调用那样链接s3.getObject方法。

await DynamoDB.put(dbparams).promise()

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

try {
    await DynamoDB.put(dbparams).promise()
} catch (e) {
    console.log(e)
}

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

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

答案 1 :(得分:0)

UTF-8编码在节点中用作参数时通常为utf8。我将从这里开始。