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 文档
使用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})});
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
| 归档时间: |
|
| 查看次数: |
1903 次 |
| 最近记录: |