无法使用nodejs在Dynamodb上使用updateExpression进行更新
cant update using updateExpression on Dynamodb using nodejs
这是我的数据结构-
{
"pk": "USER-12560000000",
"sk": "USER",
"data": {
"name": "George", //I want to modify the value of this attribute
"updatedAt": Date.now() // I want to add this attribute to the data field
}
}
我一直在 updateExpression 下面尝试这个,但出于某种原因,它甚至没有给出 cloudwatch 中错误的线索。在下面的代码中,我只是想更新 displayName 属性的值,不确定如何添加额外属性的代码。 cloudwatch 日志也不打印错误原因。我已经阅读了关于 aws 的文档以及其他一些 stackoveflow 帖子。我没能完成这项工作。
主要 Lambda 处理程序 -
const updateUser = require('./user-queries/updateUser');
exports.handler = async (event) => {
var userId = event.arguments.userId;
var name = event.arguments.name;
var avatarUrl = event.arguments.avatarUrl;
console.log(event.info.fieldName);
switch(event.info.fieldName) {
case "updateUser":
return updateUser(userId, name, avatarUrl);
}
};
const AWS = require("aws-sdk")
AWS.config.update({ region: "ca-central-1" })
const dynamoDB = new AWS.DynamoDB.DocumentClient()
async function updateUser(userId, name, avatarUrl) {
dynamoDB
.update({
TableName: "Bol-Table",
Key: {
pk: "USER-12560000000",
sk: "USER",
},
UpdateExpression: `set data = :data`,
ExpressionAttributeValues: {
":data": {
"name": "Test"
},
},
})
.promise()
.then(data => console.log(data.Attributes))
.catch(console.error)
}
module.exports = updateUser;
这是在 cloudwatch 中打印出来的内容以及一些账单信息
2021-10-09T16:25:15.527Z b1a1e4cb-6001-415c-82a3-cfdc90413e4e INFO USER-12560000000 Sam www.bol.com
你的UpdateExpression
和ExpressionAttributeValues
是错误的,它们应该是:
UpdateExpression: `set data.name = :x`
...
ExpressionAttributeValues: {
":x": "Test"
}
Key
对象还将键作为 string
接受,因此您的 Key
对象需要看起来像:
Key: {
"pk": "USER-12560000000",
"sk": "USER"
}
对于 update/insert 多个字段,以下将起作用:
UpdateExpression: `set data.name = :x, data.updatedAt = :y`
...
ExpressionAttributeValues: {
":x": "Test",
":y": Date.now()
}
像下面这样更改 dynamodb.update 最终一切正常。
await dynamoDB.update(params).promise();
这里是所有遇到此问题的人的完整代码。
const AWS = require("aws-sdk")
AWS.config.update({ region: "ca-central-1" })
const dynamoDB = new AWS.DynamoDB.DocumentClient()
async function updateUser(userId, name, avatarUrl) {
var params = {
TableName: "Bol-Table",
Key: {
"pk": userId,
"sk": 'USER',
},
UpdateExpression: 'SET details.displayName = :name, details.avatarUrl = :avatarUrl, details.updatedAt = :updateDate',
ExpressionAttributeValues: {
':name': name,
':avatarUrl':avatarUrl,
':updateDate': new Date().toISOString()
},
ReturnValues: 'ALL_NEW'
};
const Item = await dynamoDB.update(params).promise();
console.log(Item)
}
module.exports = updateUser;
{
"pk": "USER-12560000000",
"sk": "USER",
"data": {
"name": "George", //I want to modify the value of this attribute
"updatedAt": Date.now() // I want to add this attribute to the data field
}
}
我一直在 updateExpression 下面尝试这个,但出于某种原因,它甚至没有给出 cloudwatch 中错误的线索。在下面的代码中,我只是想更新 displayName 属性的值,不确定如何添加额外属性的代码。 cloudwatch 日志也不打印错误原因。我已经阅读了关于 aws 的文档以及其他一些 stackoveflow 帖子。我没能完成这项工作。
主要 Lambda 处理程序 -
const updateUser = require('./user-queries/updateUser');
exports.handler = async (event) => {
var userId = event.arguments.userId;
var name = event.arguments.name;
var avatarUrl = event.arguments.avatarUrl;
console.log(event.info.fieldName);
switch(event.info.fieldName) {
case "updateUser":
return updateUser(userId, name, avatarUrl);
}
};
const AWS = require("aws-sdk")
AWS.config.update({ region: "ca-central-1" })
const dynamoDB = new AWS.DynamoDB.DocumentClient()
async function updateUser(userId, name, avatarUrl) {
dynamoDB
.update({
TableName: "Bol-Table",
Key: {
pk: "USER-12560000000",
sk: "USER",
},
UpdateExpression: `set data = :data`,
ExpressionAttributeValues: {
":data": {
"name": "Test"
},
},
})
.promise()
.then(data => console.log(data.Attributes))
.catch(console.error)
}
module.exports = updateUser;
这是在 cloudwatch 中打印出来的内容以及一些账单信息 2021-10-09T16:25:15.527Z b1a1e4cb-6001-415c-82a3-cfdc90413e4e INFO USER-12560000000 Sam www.bol.com
你的UpdateExpression
和ExpressionAttributeValues
是错误的,它们应该是:
UpdateExpression: `set data.name = :x`
...
ExpressionAttributeValues: {
":x": "Test"
}
Key
对象还将键作为 string
接受,因此您的 Key
对象需要看起来像:
Key: {
"pk": "USER-12560000000",
"sk": "USER"
}
对于 update/insert 多个字段,以下将起作用:
UpdateExpression: `set data.name = :x, data.updatedAt = :y`
...
ExpressionAttributeValues: {
":x": "Test",
":y": Date.now()
}
像下面这样更改 dynamodb.update 最终一切正常。
await dynamoDB.update(params).promise();
这里是所有遇到此问题的人的完整代码。
const AWS = require("aws-sdk")
AWS.config.update({ region: "ca-central-1" })
const dynamoDB = new AWS.DynamoDB.DocumentClient()
async function updateUser(userId, name, avatarUrl) {
var params = {
TableName: "Bol-Table",
Key: {
"pk": userId,
"sk": 'USER',
},
UpdateExpression: 'SET details.displayName = :name, details.avatarUrl = :avatarUrl, details.updatedAt = :updateDate',
ExpressionAttributeValues: {
':name': name,
':avatarUrl':avatarUrl,
':updateDate': new Date().toISOString()
},
ReturnValues: 'ALL_NEW'
};
const Item = await dynamoDB.update(params).promise();
console.log(Item)
}
module.exports = updateUser;