使用DynamoDB文档客户端-Java

时间:2018-08-23 16:09:17

标签: 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");
        }
      });
    }

在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  

任何帮助,不胜感激!它应根据AWS文档AWS Documentation

上给出的原子更新示例运行。

2 个答案:

答案 0 :(得分:0)

使用add而不是set。如果未定义初始值,则将使用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})});

考虑在lambda上使用更新版本的NodeJS;)v10将于几个月后https://github.com/nodejs/Release#release-schedule

用于LTS

对于DynamoDB nodejs客户端,我个人也觉得此文档最有用:https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html

答案 1 :(得分:0)

谢谢,卢卡斯!

对于一个新开发人员来说,文档非常令人困惑-您的回答已解释并解决了我的问题,并显示了如何正确使用ExpressionAttributeNames,谢谢!

int counter = 0;
public void main1()
{
    counter += 1;
    if ( counter < 5 )
        this.main1();
}