Почему моя лямбда-функция не работает должным образом? - PullRequest
2 голосов
/ 25 октября 2019

Я получаю эту ошибку от лямбды: errorType":"Runtime.UnhandledPromiseRejection","errorMessage":"Error: Unable to stringify response body

Я пытаюсь запустить свою лямбду от загрузки в s3 (эта часть работает), а затем это должно что-то опубликовать в DynamoDB

вот моя лямбда в полном объеме

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, - это просто объект json с 4 ключами, так что ничего большого. моя таблица состоит только из первичного ключа с именем user_id, и это поле IS в моем объекте json, которое возвращается из S3, так что не знаете, почему это не работает?

Ответы [ 2 ]

2 голосов
/ 25 октября 2019

DynamoDB.put является обратным вызовом, и вы пытаетесь await на него, так что это никогда не сработает. Вы должны связать метод .promise() так же, как вы это делали с помощью вызова s3.getObject.

await DynamoDB.put(dbparams).promise()

Если вы хотите обрабатывать ошибки, просто оберните его в блок try/catch:

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

Кроме того, вам также необходимо передать атрибут Item вашего вызова DynamoDB объектом JSON, а не строкой.

Я не уверен, чтовы получаете от s3, но преобразование его в объект JSON с помощью JSON.parse(dataToDb) должно сработать, если данные являются допустимым объектом JSON.

0 голосов
/ 25 октября 2019

Кодировка UTF-8 обычно равна utf8 при использовании в качестве аргумента в узле. Я бы начал там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...