有一个称为Portal的DynamoDB表。
从节点中编写的Lambda函数中,我想更新项目的status
和ts
字段(通过调用 signalJobStart 函数)并等待异步更新函数完成继续前的承诺。
出于某种原因,没有更新发生,但是在操作过程中未引发任何错误。
日志中没有错误,我可以在日志中看到“已完成”日志消息。
为什么表格中的项目没有更改? 为什么在日志中既看不到错误也看不到成功消息?
(我也尝试过不做任何承诺,但结果相同。表项不会更新-甚至是异步的。)
以下是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");
}};
答案 0 :(得分:0)
我认为您可以
docClient.update(params).promise()
,然后继续使用.then(...)
语句流使其工作。
就我个人而言,我认为错误处理程序语法(用于update
)可能不会给您带来希望。
让我知道是否行不通。
答案 1 :(得分:0)
查询中的meson.add_project_link_arguments()
是保留关键字,并且在 dynamodb 中是禁止的。因此,在查询中使用status
。
还使用新的Promise实现承诺
请在其帮助下查看以下内容:
ExpressionAttributeNames
注意:请同时确认您数据库中的
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
。
答案 2 :(得分:0)
对我来说有什么帮助:
以异步/等待方式执行:
exports.handler = async (event) => {
...
let _result = "";
try {
_result = await docClient.update(_updateParams).promise();
} catch(ex){
_result = ex;
}
..
确保我要写入的字段不是保留字,例如以下情况(“ data”是保留字):
{
..
UpdateExpression: "set data = :newdata",
ExpressionAttributeValues: {
":newdata": "blah"
},
..
要进行检查:将列重命名为“ data2”-没问题。
确保您具有IAM控制台中“执行角色”的权限。