
[英]How to update part of an object in an item in Dynamo using aws-sdk?
[英]AWS Lambda Dynamo update does not update the item
有一个名为 Portal 的 DynamoDB 表。 从用节点编写的 Lambda function 我想更新项目的status
和ts
字段(通过调用signalJobStart函数)并等待异步更新 function 完成 promise 然后继续。 由于某种原因没有更新发生,但是在操作期间没有出现错误。 日志中没有错误,我可以在日志中看到“FINISHED”日志消息。
为什么表中的项目没有变化? 为什么我在日志中既看不到错误消息也看不到成功消息?
(我也试过没有 promise,结果相同。表项没有更新——甚至是异步的。)
这是来自 Lambda 的代码:
const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient({region: 'eu-west-1'});
module.exports = {
signalJobStart: function(accountId, jobId) {
console.log("Signaling job start for account %s and job %s", accountId, jobId);
let table = "Portal";
let params = {
TableName: table,
Key:{
"accountid": accountId,
"entity": jobId
},
UpdateExpression: "SET status = :s, ts = :t",
ExpressionAttributeValues:{
":s": "running",
":t": Date.now()
},
ReturnValues:"UPDATED_NEW"
};
let updatePromise = docClient.update(params, function(err, data) {
if (err) {
console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2));
} else {
console.log("UpdateItem succeeded:", JSON.stringify(data, null, 2));
}
}).promise();
updatePromise.then(function(data) {
console.log('Success');
}).catch(function(err) {
console.log(err);
});
console.log("FINISHED");
}};
我想你可以
docClient.update(params).promise()
然后继续使用.then(...)
语句流使其工作。 就个人而言,我认为错误处理程序语法(用于update
)可能不会给您带来承诺。
如果这不起作用,请告诉我。
什么对我有帮助:
以异步/等待方式执行:
exports.handler = async (event) => { ... let _result = ""; try { _result = await docClient.update(_updateParams).promise(); } catch(ex){ _result = ex; } ..
确保我写入的字段不是保留字,如以下情况(“数据”是保留字):
{ .. UpdateExpression: "set data = :newdata", ExpressionAttributeValues: { ":newdata": "blah" }, ..
要检查这一点:将列重命名为“data2”——它没有问题。
确保您在 IAM 控制台的“执行角色”中拥有权限。
在您的查询status
是保留关键字并在dynamodb 中被禁止。 所以在您的查询中使用ExpressionAttributeNames
。
也使用 new Promise 来处理 promise
请在下面查看它对您的帮助:
module.exports = {
signalJobStart: function (accountId, jobId) {
return new Promise(function (resolve, reject) {
console.log("Signaling job start for account %s and job %s", accountId, jobId);
let table = "Portal";
let params = {
TableName: table,
Key: {
"accountid": accountId,
"entity": jobId
},
UpdateExpression: "SET #status = :s, ts = :t",
ExpressionAttributeNames: {
'#status': 'status'
},
ExpressionAttributeValues: {
":s": "running",
":t": Date.now()
},
ReturnValues: "UPDATED_NEW"
};
docClient.update(params, function (err, data) {
if (err) {
console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2));
reject(err)
} else {
console.log("UpdateItem succeeded:", JSON.stringify(data, null, 2));
resolve({ message: 'sucsss', data: data })
}
})
});
}
};
注意:还请确认
accountid
和entity
都是您数据库中的Key
。
let params = {
TableName: table,
Key:{
"accountid": accountId,
"entity": jobId
},
UpdateExpression: "SET #status = :s, #ts = :t",
ExpressionAttributeNames: { "#status": "status", "#ts" : "ts" },
ExpressionAttributeValues:{
":s": "running",
":t": Date.now()
},
ReturnValues:"UPDATED_NEW"
};
在参数中添加ExpressionAttributeNames: { "#status": "status", "#ts": "ts" } ,它应该工作,对我有用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.