我在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
上给出的原子更新示例运行。答案 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();
}