简体   繁体   English

如何使用nodejs将数据添加到dynamoDB中的多条记录的列表中?

[英]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)));

在此处输入图像描述

在此处输入图像描述

with new suggested approach.采用新的建议方法。 在此处输入图像描述

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM