Dynamodb atomi c увеличение для еще не присутствующего ключа в nodejs - PullRequest
0 голосов
/ 14 июля 2020

Я новичок ie за nodejs. У меня очень простая таблица DynamoDB с именем IdCount со строковым первичным ключом, id (строка).

Я хочу использовать atomi c показано увеличение здесь , но включая несуществующие ключ.

Обратите внимание, что я использовал поле count (N: число).

Мой код:

const AWS = require('aws-sdk');
const ddb = new AWS.DynamoDB.DocumentClient();

async function increaseIdCounter(id) {
    var table = "IdCount";

    var params = {
        TableName:table,
        Key:{
            "id": id
        },
        UpdateExpression: "Set count = if_not_exists(count, :zero) + :increase",
        ExpressionAttributeValues: {
            ":increase": { "N": "1"},
            ":zero": { "N": "0"}
        },
        ReturnValues: "UPDATED_NEW"
    };

    var res = ddb.update(params, function(err, data) {
        if (err) {
            console.error("failed to update ", id);
        } else {
            console.log("Returned new value: ", data.Attributes.count);
        }
    });
    return res;
}

exports.handler = async (event) => {
    var re = await increaseIdCounter(event);
    
    const response = {
                statusCode: 200,
                body: JSON.stringify(re.Attributes.count),
            };
    return response;
};

Из этого кода, из AWS лямбда-консоль, я получил:

Response:
{
  "errorType": "TypeError",
  "errorMessage": "Cannot read property 'count' of undefined",
  "trace": [
    "TypeError: Cannot read property 'count' of undefined",
    "    at Runtime.exports.handler (/var/task/index.js:33:52)"
  ]
}

Любое предложение будет очень полезным. Спасибо.

1 Ответ

0 голосов
/ 14 июля 2020

AWS.DynamoDB.DocumentClient.update(params, [callback]) возвращает AWS.Request, а не обещание. Чтобы получить обещание, вам нужно позвонить по номеру AWS.Request.promise().

Довольно нетрадиционно предоставлять обратный вызов и ждать обещания. Я бы посоветовал не предоставлять обратный вызов, поскольку он не является обязательным и вы на самом деле не делаете в нем ничего значимого. Ваш код будет примерно таким:

return ddb.update(params).promise()

...