无法使用 DynamoDB 文档客户端在 dynamodb 表中增加分数 - Javascript

Kir*_*rkR 5 javascript node.js amazon-dynamodb

我有一个部署在 Lambda (nodejs6.10) 上的无服务器应用程序,可以从我的 DynamoDB 创建和读取用户,但是,我在尝试对特定属性执行更新时遇到问题。

基本上,我的表有一个 userId 键和两个名为 email 和 score 的属性。

应用程序检测是否提供了推荐代码 (userId),如果是,则应将其分数增加 1。以下是我传递给 dynamoDb.update 函数的参数。

if (refcode) {
      console.log("A referral code: " + refcode + " was detected");

      const params = {
        TableName: USERS_TABLE,
        Key: {
          userId: refcode
        },
        UpdateExpression: "set score = score + :val",
        ExpressionAttributeValues: {
          ":val": 1
        },
        ReturnValues: "UPDATED_NEW"
      };

      console.log(params);

      dynamoDb.update(params, (error, result) => {
        console.log("Checking for error...");
        if (error) {
          console.log(error);
          res.status(400), json({ error: "Could not GET user" });
        }
        console.log("Checking for result...");
        if (result.Item) {
          console.log("Item updated");
          const { userId, email, score } = result.Item;
        } else {
          res.status(404).json({ error: "Invalid referral code" });
          console.log("Invalid ref code");
        }
      });
    }
Run Code Online (Sandbox Code Playgroud)

在Cloudwatch中可以看到我的函数已经成功进入了这部分逻辑,但是好像从来没有运行过dynamoDb.update部分。以下是 cloudwatch 日志:

START RequestId: 7d92d4da-a710-11e8-abdd-039e23e278bd Version: $LATEST
2018-08-23T20:09:52.392Z    7d92d4da-a710-11e8-abdd-039e23e278bd    A referral code: cEBeGM1sk was detected
2018-08-23T20:09:52.393Z    7d92d4da-a710-11e8-abdd-039e23e278bd    { TableName: '**<redacted>**',
Key: { userId: 'cEBeGM1sk' },
UpdateExpression: 'set score = score + :val',
ExpressionAttributeValues: { ':val': 1 },
ReturnValues: 'UPDATED_NEW' }
2018-08-23T20:09:52.550Z    7d92d4da-a710-11e8-abdd-039e23e278bd    Reached the end - taking user to thank you page
END RequestId: 7d92d4da-a710-11e8-abdd-039e23e278bd
REPORT RequestId: 7d92d4da-a710-11e8-abdd-039e23e278bd  Duration: 1530.76 ms    Billed Duration: 1600 ms Memory Size: 128 MB    Max Memory Used: 45 MB  
Run Code Online (Sandbox Code Playgroud)

非常感谢任何帮助!它应该根据 AWS 文档中给出的原子更新示例工作:AWS 文档

Luk*_*kas 5

使用addset。如果未定义初始值,将使用 0。

此代码执行预期的操作:

const AWS = require('aws-sdk');
const getEnv = require('../../../helpers/environment/get');

AWS.config.update({
  accessKeyId: getEnv('AWS_ACCESS_KEY'),
  secretAccessKey: getEnv('AWS_ACCESS_KEY_SECRET'),
  region: getEnv('AWS_REGION'),
});

const client = new AWS.DynamoDB.DocumentClient();

const queryResult = await dynamo.update({
    TableName: getEnv('AWS_DYNAMO_TABLE_LOG'),
    Key: {
      pk: 'a',  
      t: 1,  
    },
    UpdateExpression: 'add #test :value',
    ExpressionAttributeNames: {
      '#test': 'test_incr',
    },
    ExpressionAttributeValues: {
      ':value': 2,
    },
    ReturnConsumedCapacity: 'TOTAL',
    ReturnValues: 'ALL_NEW',
  }, (error, data) => {console.log({error, data})});
Run Code Online (Sandbox Code Playgroud)

考虑在 lambda 中使用较新版本的 NodeJS ;) 最近支持的任何 LTS 通常是最佳选择https://github.com/nodejs/Release#release-schedule

同样对于 DynamoDB nodejs 客户端,我个人认为这个文档最有用:https ://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html