Node.js AWS Lambda Dynamo更新不更新项目
有一个名为Portal的DynamoDB表。 从节点中编写的Lambda函数中,我想更新一个项目的Node.js AWS Lambda Dynamo更新不更新项目,node.js,amazon-web-services,aws-lambda,amazon-dynamodb,Node.js,Amazon Web Services,Aws Lambda,Amazon Dynamodb,有一个名为Portal的DynamoDB表。 从节点中编写的Lambda函数中,我想更新一个项目的状态和ts字段(通过调用signalJobStart函数),并等待异步更新函数完成并给出承诺,然后继续。 由于某种原因,没有发生更新,但是在操作过程中没有引发错误。 日志中没有错误,我可以在日志中看到“FINISHED”日志消息 为什么表中的项目没有更改? 为什么我在日志中既看不到错误也看不到成功消息? (我也在没有承诺的情况下进行了尝试,得到了相同的结果。表项不会得到更新,甚至是异步更新。) 以下
状态
和ts
字段(通过调用signalJobStart函数),并等待异步更新函数完成并给出承诺,然后继续。
由于某种原因,没有发生更新,但是在操作过程中没有引发错误。
日志中没有错误,我可以在日志中看到“FINISHED”日志消息
为什么表中的项目没有更改?
为什么我在日志中既看不到错误也看不到成功消息?
(我也在没有承诺的情况下进行了尝试,得到了相同的结果。表项不会得到更新,甚至是异步更新。)
以下是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()
然后继续使用。然后(…)
语句流使其工作。
就个人而言,我认为错误处理程序语法(用于更新
)可能不会给您带来承诺
如果不起作用,请告诉我 我想你可以
docClient.update(params).promise()
然后继续使用。然后(…)
语句流使其工作。
就个人而言,我认为错误处理程序语法(用于更新
)可能不会给您带来承诺
如果不起作用,请告诉我 在您的查询中,
状态
是保留关键字,并且在dynamodb中被禁止。因此,在查询中使用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
都是数据库中的键
在您的查询中,状态
是保留关键字,并且在dynamodb中被禁止。因此,在查询中使用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
都是数据库中的键
对我的情况有帮助的是:
以异步/等待方式执行以下操作:
exports.handler = async (event) => {
...
let _result = "";
try {
_result = await docClient.update(_updateParams).promise();
} catch(ex){
_result = ex;
}
..
确保我写入的字段不是像以下情况一样的保留字(“数据”是保留字):
要检查这一点:将列重命名为,比如说,“data2”-它没有问题
确保您在IAM控制台的“执行角色”中拥有权限
对我的情况有帮助的是:
以异步/等待方式执行以下操作:
exports.handler = async (event) => {
...
let _result = "";
try {
_result = await docClient.update(_updateParams).promise();
} catch(ex){
_result = ex;
}
..
确保我写入的字段不是像以下情况一样的保留字(“数据”是保留字):
要检查这一点:将列重命名为,比如说,“data2”-它没有问题
确保您在IAM控制台的“执行角色”中拥有权限
早些时候,我还尝试省略错误处理程序,结果相同(否)。现在我又搬走了,还是没有成功。刚刚更改为:让updatePromise=docClient.update(params.promise();你能确认在这种新的语法中,updatePromise
不是一个承诺吗?这确实是一个很好的线索。我刚刚检查了一下,它是一个承诺,以promise{}
的身份注销,尽管我怀疑它是挂起和超时的?早些时候,我还尝试了省略错误处理程序,结果是相同的(否)。现在我又搬走了,还是没有成功。刚刚更改为:让updatePromise=docClient.update(params.promise();你能确认在这种新的语法中,updatePromise
不是一个承诺吗?这确实是一个很好的线索。我刚刚检查了一下,它是一个承诺,以promise{}
的身份注销,尽管我怀疑它挂起了,并且超时?按照您的建议进行了更改,但仍然没有成功accountid
是主分区键,而entity
是表中的主排序键。不会引发任何错误。Lambda函数正在正常完成。最终完成的注释将被注销。请详细说明使用新承诺
。打印控制台.log(“完成”)代码>首先打印,因为它是异步的,所以不等待更新。你可以在那之后检查打印的内容。那之后什么都没有,只是完成了lambda。异步调用似乎处于挂起状态,可能未完成。只是我不知道为什么超时时没有错误。你能试着用我的新代码替换你的旧代码吗?按照你的建议,仍然没有成功accountid
是主分区键,而entity
是表中的主排序键。不会引发任何错误。Lambda函数正在正常完成。最终完成的注释将被注销。请详细说明使用新承诺
。打印控制台.log(“完成”)代码>首先打印,因为它是异步的,所以不等待更新。你可以在那之后检查打印的内容。那之后什么都没有,只是完成了lambda。异步调用似乎处于挂起状态,可能未完成。只是我不知道为什么超时时没有错误。你能试着用我的新代码替换你的旧代码吗