es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

BatchGetItem retorna exitoso pero nulo.

Intentando ejecutar un BatchGetItem desde Lambda a DynamoDB, sin embargo, cuando ejecuto la consulta, devuelve una respuesta nula y no registra ningún problema. Las claves primarias (PK) y las claves de ordenamiento (SK) existen en la tabla y los valores asociados a cada una se almacenan actualmente en la tabla, como se muestra a continuación. La función Lambda tiene permisos para ejecutar BatchGetItem en esa tabla específica y cuando ejecuto un solo GetItem en esa misma tabla, funciona correctamente y devuelve un solo elemento. Cualquier ayuda para tratar de hacer que BatchGetItem devuelva los elementos consultados sería muy apreciada. Gracias.

Imagen de DynamoDB

DynamoDB Attributes

Código de Lambda

// Cargar la SDK de AWS para Node.js
var AWS = require('aws-sdk');
// Establecer la región
AWS.config.update({region: 'us-east-1'});

// Crear el objeto de servicio DynamoDB
var ddb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

var info;

exports.handler = async (event, context) => {
  var params = {
    RequestItems: {
      "candidates": {
        Keys: [
          {
            "PK": {S: "jack"},
            "SK": {S: "C108951642"}
          },
          {
            "PK": {S: "ben"},
            "SK": {S: "C143956179"}
          },
          {
            "PK": {S: "hill"},
            "SK": {S: "C268283233"}
          }
        ],
        ProjectionExpression: "Name"
      }
    }
  };

  ddb.batchGetItem(params, function(err, data) {
    if (err) {
      console.log("Error", err);
    } else {
      data.Responses.TABLE_NAME.forEach(function(element, index, array) {
        console.log(element);
        info = element;
      });
    }
  });
  return info;
}

Respuesta de Lambda

Evento de prueba: batch

Respuesta: nulo

Registros de la función:
START RequestId: a411114a-29b9-4f7f-bc20-2a5caff9f0cf Versión: $LATEST
END RequestId: a411114a-29b9-4f7f-bc20-2a5caff9f0cf
INFORME RequestId: a411114a-29b9-4f7f-bc20-2a5caff9f0cf  Duración: 442.11 ms Tiempo facturado: 443 ms Tamaño de memoria: 128 MB Memoria máxima utilizada: 78 MB

ID de solicitud: a411114a-29b9-4f7f-bc20-2a5caff9f0cf
Tags:  , ,

Answer

  1. Avatar for davy.ai

    En primer lugar, asegúrate de que TABLE_NAME en data.Responses.TABLE_NAME sea reemplazado por el nombre real de tu tabla en el código de la función Lambda.

    Dado que la función Lambda devuelve null, una posibilidad es que el método batchGetItem no esté esperando la respuesta de DynamoDB antes de ejecutar la sentencia de retorno. Esto se puede solucionar envolviendo el método batchGetItem en una Promesa y utilizando await para esperar a que se resuelva.

    Modifica el código del controlador de Lambda de la siguiente manera:

    exports.handler = async (event, context) => {
      var params = {
        RequestItems: {
          "candidates": {
            Keys: [
              {
                "PK": {S: "jack"},
                "SK": {S: "C108951642"}
              },
              {
                "PK": {S: "ben"},
                "SK": {S: "C143956179"}
              },
              {
                "PK": {S: "hill"},
                "SK": {S: "C268283233"}
              }
            ],
            ProjectionExpression: "Name"
          }
        }
      };
    
      const data = await new Promise((resolve, reject) => {
        ddb.batchGetItem(params, function(err, data) {
          if (err) {
            console.log("Error", err);
            reject(err);
          } else {
            resolve(data.Responses.candidates);
          }
        });
      });
      console.log('Respuesta: ', data);
      return data;
    }
    

    Esto envuelve el método batchGetItem en una Promesa, que se resolverá con los datos de DynamoDB una vez que la consulta esté completa. La palabra clave await se utiliza para esperar a que la Promesa se resuelva.

    Además, agrega una declaración console.log a la función Lambda para registrar la respuesta de DynamoDB con fines de depuración.

    Con estos cambios, la función Lambda ahora debería ejecutar correctamente la consulta BatchGetItem y devolver los elementos consultados.

Comments are closed.