Esto parece una pregunta realmente estúpida, pero mi falta de conocimiento de JS combinada con la falta de conocimiento de AWS me tiene en un aprieto. Solo estoy tratando de familiarizarme con una pila básica de AWS, es decir, Lambda/Dynamo/API Gateway para un trabajo básico de API.
Si quiero un punto final de API simple para manejar solicitudes PUT, por ejemplo, https://my.endpoint.amazonaws.com/users . Si tengo una tabla de userID con una clave primaria compuesta de ID de usuario y timestamp de tiempo, podría usar el fragmento de código a continuación para tomar los datos desconocidos (atributos que no se conocían al configurar un esquema), pero esto obviamente no funciona bien
const dynamo = new AWS.DynamoDB.DocumentClient(); let requestJSON = JSON.parse(event.body); await dynamo .put({ TableName: "myDynamoTable", Item: { userID: requestJSON.userID, timestamp: requestJSON.timestamp, data: requestJSON.data } }) .promise(); Podría enviar una solicitud PUT con el siguiente JSON
{ "userID": "aaaa1111", "timestamp": 1649677057, "data": { "address": "Elm Street", "name": "Glen" } } pero luego address y el name se meten en un solo atributo de DynamoDB llamado data . ¿Cómo construyo el código de node para crear un nuevo atributo llamado address y un name con los valores correspondientes, si no conocía estos atributos, es decir, quiero usar JSON en mi solicitud como se muestra a continuación, pero asumiendo que no lo sé? esto y no puedo usar requestJSON.address
{ "userID": "aaaa1111", "timestamp": 1649677057, "address": "Elm Street", "name": "Glen" }Puede utilizar el operador de propagación , por ejemplo:
const data = { address: "Elm Street", name: "Glen", }; const item = { userID: "aaaa1111", timestamp: 1649677057, ...data, }; console.log("item:", item);Si insiste en el contrato API como
{ "userID": "aaaa1111", "timestamp": 1649677057, "data": { "address": "Elm Street", "name": "Glen" } }entonces puedes hacer un mapeo en el nivel de TypeScript
const request: {userID: string, timestamp: number, data: any} = { "userID": "aaaa1111", "timestamp": 1649677057, "data": { "address": "Elm Street", "name": "Glen" } }; const ddbObject: any = { "userID": request.userID, "timestamp": request.timestamp }; Object .keys(request.data) .forEach(key => ddbObject[key] = request.data[key]); La representación de ddbObject es
{ "userID": "aaaa1111", "timestamp": 1649677057, "address": "Elm Street", "name": "Glen" }