Зачем мне анализировать номер из DynamoDB? - PullRequest
0 голосов
/ 19 мая 2018

На прошлой неделе я играл с AWS и начал создавать Lambda и играть с DynamoDB.

Я боролся много часов, пытаясь понять, почему я получаю страшную ошибку The provided key element does not match the schemaи я наконец сломался и бросил 1 вместо id.К моему шоку Lambda наконец-то сработала.Еще играю, и я обнаружил, что мне нужно сделать parseInt(id).

Может кто-нибудь объяснить, почему?Ниже приведен мой простой лямбда для обновления столбца.

var AWS = require('aws-sdk');
AWS.config.update({region: 'us-east-1'});

var ddb = new AWS.DynamoDB;
var docClient = new AWS.DynamoDB.DocumentClient();

function updateField(id) {
    var params = {
        TableName: 'MyTable',
        Key: {
            'Id': parseInt(id)
        },
        UpdateExpression: `SET #c = :val`,
        ExpressionAttributeNames: {
            '#c': 'MyField'
        },
        ExpressionAttributeValues: {
            ":val": 1
        },
        ReturnValues: "UPDATED_NEW"
    };

    docClient.update(params, function(err, data) {
        if (err) {
            console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2));
        } else {
            console.log("Updated");
        }
    });
}

exports.handler = function(event, context) {
    ddb.scan({
        TableName: 'MyTable',
        Limit: 1
    }, function(err, data) {
        if (err) {
            console.log("Error", err);
        } else {
            var item = data.Items[0];               
            updateField(item.Id.N);
        }
    });
};

Я читаю значение Id прямо из DynamoDB и использую свойство N.Почему я должен анализировать его для int, чтобы использовать его снова?Это мой неспособность понять что-то такое простое в JavaScript или DynamoDB делает то, чего я не ожидаю?

//Works
Key: {
   'Id': parseInt(id)
}
//Does not work even though id came right from the database
Key: {
   'Id': id
}

1 Ответ

0 голосов
/ 19 мая 2018

Существует большая разница между ответами непосредственно от AWS.DynamoDB и AWS.DynamoDB.DocumentClient.Короче говоря, первый вернет числа в виде строк, а второй вернет числа в виде чисел.

Вы используете оба, когда вам, вероятно, следует просто использовать одно, чтобы избежать подобных проблем.

var ddb = new AWS.DynamoDB;
var docClient = new AWS.DynamoDB.DocumentClient();

DocumentClient упрощает «чистые» вызовы DynamoDB.Из документации :

[DocumentClient] аннотирует собственные типы JavaScript, предоставляемые в качестве входных параметров, а также преобразует аннотированные данные ответов в собственные типы JavaScript.

Но, хотя вы используете его для update, вы не используете DocumentClient для сканирования.Вместо этого вы напрямую используете AWS.DynamoDB с ddb.scan().Это вернет результаты, отформатированные иначе (и несколько нелогично), чем DocumentClient.В частности, из документации (см. "Синтаксис ответа") мы видим, что числа возвращаются в виде строк:

"N": "строка"

Итак, вы можете продолжить приведение строк в числа или, предпочтительно, поменять местами все обычные взаимодействия с DynamoDB с DynamoDB.DocumentClient, так как он предназначен для лучшей интеграции с Node / Javascript.

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