[英]How to add data to a List, of multiple records in dynamoDB using nodejs?
Need solution to to add data to a List, of multiple records in dynamoDB using nodejs.需要使用 nodejs 将数据添加到 dynamoDB 中的多个记录的列表的解决方案。 Appreciate in advance.. Scenario i have 2 user.提前欣赏.. 场景我有 2 个用户。
user1 = {
id: '',
email: '',
sendRequest: [
],
request: [
],
friendsList: [
],
};
user2 = {
id: '',
email: '',
sendRequest: [
],
request: [
],
friendsList: [
],
};
If user1 sends a request to user2.如果 user1 向 user2 发送请求。 i need to add requested user details to "user1.sendRequest" and also sender details to "user2.request" list.我需要将请求的用户详细信息添加到“user1.sendRequest”,并将发件人详细信息添加到“user2.request”列表。
I have tried below code but it only update 2nd item in TransactWriteItem object.我试过下面的代码,但它只更新 TransactWriteItem object 中的第二项。
TransactItems: [
{
Update: {
TableName: usersTabel,
Key: {
id: { S: reqBody.reqId }
},
UpdateExpression: 'SET #sendRequest = list_append(if_not_exists(#sendRequest, :empty_list), :updateValue)',
ExpressionAttributeNames: {
'#sendRequest': 'sendRequest'
},
ExpressionAttributeValues: {
':updateValue': { L: [initiatorPost] },
':empty_list': { L: [] },
},
},
Update: {
TableName: usersTabel,
Key: {
id: { S: reqBody.sub }
},
UpdateExpression: 'SET #request = list_append(if_not_exists(#request, :empty_list), :updateValue)',
ExpressionAttributeNames: {
'#request': 'request'
},
ExpressionAttributeValues: {
':updateValue': { L: [recieverPost] },
':empty_list': { L: [] },
},
}
}
]
}
return db
.transactWriteItems(TransactItems)
.promise()
.then(() => {
const callBackResponse = reqBody;
callBackResponse.status ="success"
callback(null, response(201, callBackResponse));
})
.catch((err) => response(null, response(err.statusCode, err)));
New approach新的方法
I tested this approach works as expected:我测试了这种方法按预期工作:
var db = new AWS.DynamoDB.DocumentClient();
let updateItems = {
TransactItems: [
{
Update: {
TableName: usersTabel,
Key: {
id: reqBody.reqId
},
UpdateExpression: 'SET sendRequest = list_append(if_not_exists(sendRequest, :emptyValue), :updateValue)',
ExpressionAttributeValues: {
':emptyValue': [],
':updateValue': [initiatorPost]
}
},
Update: {
TableName: usersTabel,
Key: {
id: reqBody.sub
},
UpdateExpression: 'SET myRequest = list_append(if_not_exists(myRequest, :emptyValue), :updateValue)',
ExpressionAttributeValues: {
':emptyValue': [],
':updateValue': [recieverPost]
}
}
}
]
}
return db.transactWrite(updateItems).promise().then(res => {
console.log(res)
}).catch(err => {
console.log(err, " ERROR")
});
Let me know if you get other issue through...让我知道您是否通过...解决其他问题
Below code works.下面的代码有效。 Please suggest better solution if any?如果有的话,请提出更好的解决方案?
'use strict';
const AWS = require('aws-sdk');
const db = new AWS.DynamoDB({ apiVersion: '2019.11.21' });
const usersTabel = process.env.USERS_TABLE;
function response(statusCode, message) {
return {
statusCode: statusCode,
body: JSON.stringify(message),
"headers": {"Access-Control-Allow-Origin":"*"}
};
}
module.exports.sendRequest = (event, context, callback) => {
// const reqBody = event;
console.log("check event::::::::"+event);
console.log("reqBody.reqId"+event.reqId);
console.log("reqBody.sub"+event.sub)
const reqBody = event;
// const reqBody = JSON.parse(event.body);
if (
!reqBody.reqId ||
reqBody.reqId.trim() === '' ||
!reqBody.sub ||
reqBody.sub.trim() === '' ||
!reqBody.email ||
reqBody.email.trim() === ''
) {
return callback(
null,
response(400, {
error: 'Post must have a reqId, sub and email and they must not be empty'
})
);
}
const initiatorPost = {
M: {
createdAt: { S: new Date().toISOString() },
sub: { S: reqBody.sub },
email: { S: reqBody.email }
}
};
const recieverPost = {
M: {
createdAt: { S: new Date().toISOString() },
sub: { S: reqBody.reqId },
email: { S: reqBody.reqEmail },
friendshipStatus: { S: "pending" }
}
};
const TransactItems1 = {
TransactItems: [
{
Update: {
TableName: usersTabel,
Key: {
id: { S: reqBody.reqId }
},
UpdateExpression: 'SET #sendRequests = list_append(#sendRequests, :updateValue)',
ExpressionAttributeNames: {
'#sendRequests': 'sendRequests'
},
ExpressionAttributeValues: {
':updateValue': { L: [initiatorPost] }
},
}
}
]
};
const TransactItems2 = {
TransactItems: [
{
Update: {
TableName: usersTabel,
Key: {
id: { S: reqBody.sub }
},
UpdateExpression: 'set #myRequests = list_append(#myRequests, :updateValue)',
ExpressionAttributeNames: {
'#myRequests': 'myRequests'
},
ExpressionAttributeValues: {
':updateValue': { L: [recieverPost] }
},
}
}
]
}
return db
.transactWriteItems(TransactItems1)
.promise()
.then(() => {
return db
.transactWriteItems(TransactItems2)
.promise()
.then(() => {
const callBackResponse = reqBody;
callBackResponse.status ="success"
callback(null, response(201, callBackResponse));
})
.catch((err) => response(null, response(err.statusCode, err)));
})
.catch((err) => response(null, response(err.statusCode, err)));
};
Fixed the syntax and works as expected.修复了语法并按预期工作。 Below is the Before(where i had issue) and After(is the fix).下面是之前(我遇到问题的地方)和之后(是修复)。
Before.
TransactItems: [
{
Update: {},
Update: {},
}
]
After
TransactItems: [
{
Update: {},
},
{
Update: {},
}
]
whole code.整个代码。
const params = {
TransactItems: [
{
Update: {
TableName: usersTabel,
Key: {
id: { S: reqBody.reqId }
},
UpdateExpression: 'SET #sendRequests = list_append(#sendRequests, :updateValue)',
ExpressionAttributeNames: {
'#sendRequests': 'sendRequests'
},
ExpressionAttributeValues: {
':updateValue': { L: [initiatorPost] }
},
}
},
{
Update: {
TableName: usersTabel,
Key: {
id: { S: reqBody.sub }
},
UpdateExpression: 'SET #myRequests = list_append(#myRequests, :updateValue)',
ExpressionAttributeNames: {
'#myRequests': 'myRequests'
},
ExpressionAttributeValues: {
':updateValue': { L: [recieverPost] }
},
}
}
]
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.