![](/img/trans.png)
[英]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.