在请求中,我可能有也可能没有"电子邮件"字段。
在我的DynamoDB更新调用中,我想构建一个UpdateExpression,以便更新" email"字段基于请求的值,但如果未找到,则使用字段的先前值。
当我把" email"在请求中,但如果我不这样做,它只是将字段更新为文字字符串userProfile.email,而不是路径userProfile.email
controller.js:
async function updateUserProfile(ctx) {
if (ctx.params && ctx.params.userId) {
try {
const data = await db('update')({
TableName: TABLE_NAMES.USERS,
Key: {
userId: ctx.params.userId,
},
ExpressionAttributeValues: {
':email': ctx.request.body.email || 'userProfile.email' || null,
},
UpdateExpression:
'set userProfile.email = :email,
});
ctx.status = 200;
ctx.body = data;
} catch (error) {
ctx.throw(400, error);
}
}
}
如果我的请求正文如下:
{ "email": "newEmail" }
然后更新的用户项看起来像这样:
{ "userProfile": { "email": "newEmail" }
这是有意的,但如果我不包含"电子邮件"在请求正文中,更新的用户项看起来像这样:
{ "userProfile": { "email": "userProfile.email" }
似乎UpdateExpression正在逐字地取字符串而不是将其转换为路径。我可能可以使用ConditionExpression,但还有其他字段而不是" email"而且他们也需要自己的ConditionExpression,而我只能在一个电话中有一个。
如何让它将值视为路径,还是有其他方式可以使用以前的属性值进行更新?
答案 0 :(得分:1)
它为您设置EMAIL值的方式存在问题
ExpressionAttributeValues: {
':email': ctx.request.body.email || 'userProfile.email' || null,
}
如果您没有ctx.request.body.email的价值,那么电子邮件将设置为' userProfile.email'。要使代码生效,首先应检查ctx.request.body.email!= null,然后仅分配电子邮件值。换句话说,您需要首先动态构造expressionattributes并设置该变量。
ExpressionAttributeValues:{' expressionattributevaluevriable' }