AWS Лямбда для запроса таблицы DynamoDB возвращает NULL - PullRequest
0 голосов
/ 08 июля 2020

Я новичок в AWS и сейчас застрял. Мне удалось создать веб-страницу для сбора контактной информации и записи ее в таблицу DynamoDB с именем «WebUser-ContactUS». Я создал другую (справочную) таблицу с назначениями, в которой указываю, что таблица «WebUser-ContactUS» пока должна обрабатываться сотрудником GiselleS. Я надеюсь получить имя таблицы с помощью этой лямбда-функции и динамически отображать ее содержимое в соответствии с идентификатором сотрудника.

Вот мой текущий код для получения записи из справочной таблицы, и он возвращает NULL (Успешно хотя):

// Load the AWS SDK for JS
var AWS = require("aws-sdk");

// Set a region to interact with (make sure it's the same as the region of your table)
AWS.config.update({region: 'us-west-2'});

// Create the Service interface for DynamoDB
var ddb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

// Create the Document Client interface for DynamoDB
var ddbDocClient = new AWS.DynamoDB.DocumentClient();

// Get a single item with the getItem operation
function GetTasks(tblname, itemname, employee) {
        var params = {
        TableName: "map_Assignments",
        KeyConditionExpression: "#TaskID = :TaskIDValue",
        ExpressionAttributeNames: {
            "#TaskID":"TaskID",
        },
        ExpressionAttributeValues: {
            ":TaskIDValue": itemname,
        },
        Limit: 1
    };
        ddbDocClient.query(params, function(err, data) {
          if (err) { console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2)); return 'error'}
          else { console.log("Query succeeded:", JSON.stringify(data, null, 2)); return data}
        });
}

exports.handler = function (event, context, callback) {
    console.log('Received event:', event);
    // Setting up variables:
    const AssignmentID = event.AssignmentID;
    const Action = event.Action;
    // Calculating variables:
    const Tasks = GetTasks("map_Assignments", event.TaskID, event.EmployeeNetworkID);
    
    const response = {
        statusCode: 200,
        body: Tasks
    };
    callback(null, JSON.stringify(Tasks));
};

Вот журнал: Ответ: null

Идентификатор запроса: «cb1a88f6-6496-49a5-8ee5-aab3400d49e5»

Журналы функций: START RequestId: cb1a88f6-6496-49a5-8ee5 -aab3400d49e5 Версия: $ LATEST 2020-07-08T19: 50: 30.694Z cb1a88f6-6496-49a5-8ee5-aab3400d49e5 ИНФОРМАЦИЯ Полученное событие: {EmployeeNetworkID: 'GiselleS', TaskID: 1, Action: 'Get'} 2020-07- 08T19: 50: 31.394Z cb1a88f6-6496-49a5-8ee5-aab3400d49e5 INFO Запрос выполнен успешно: {"Items": [{"TaskName": "Customer Service", "TaskID": 1, "TaskDescription": "Для обработки веб-пользователя сообщения, отправленные через форму «Связаться с нами», «EmployeeNetworkID»: «GiselleS», «CreateDt»: «2020-07-04», «TableWithTaskDetails»: «WebUser-ContactUS»}], «Count»: 1, «ScannedCount»: 1} END RequestId ...

Когда я пытаюсь получить значение имени таблицы с последней переключенной строкой ниже, функция не работает:

callback(null, JSON.stringify(Tasks[0].TableWithTaskDetails));

Вот сообщение об ошибке:

Ответ: { «errorType»: «TypeError», «errorMessage»: «Невозможно прочесть свойство 0 из неопределенного», «trace»: [«TypeError: невозможно прочесть свойство« 0 »из неопределенного», «в Runtime.exports.handler (/ var / task / index. js: 44: 40) "," в Runtime.handleOnce (/var/runtime/Runtime.js:66:25) "]}

Идентификатор запроса:" f7934e30-21ff-430b-a583-c991af3ef9e2 "

Журналы функций: START RequestId: f7934e30-21ff-430b-a583-c991af3ef9e2 Версия: $ LATEST 2020-07-08T19: 42: 19.688Z f7934e30-21ff -a583-c991af3ef9e2 INFO Полученное событие: {EmployeeNetworkID: 'GiselleS', TaskID: 1, Action: 'Get'} 2020-07-08T19: 42: 20.195Z f7934e30-21ff-430b-a583-c991af3ef9e2 ERROR Invoke Error {"errorType ":" TypeError "," errorMessage ":" Невозможно прочитать свойство "0" из неопределенного "," stack ": [" TypeError: невозможно прочитать свойство "0" из неопределенного "," в Runtime.expor ts.handler (/var/task/index.js:44:40) "," в Runtime.handleOnce (/var/runtime/Runtime.js:66:25) "]} END RequestId ...

Пожалуйста, помогите мне продвинуться вперед и получить значение поля TableWithTaskDetails «WebUser-ContactUS» как результат этой функции.

1 Ответ

0 голосов
/ 08 июля 2020

Функция GetTasks ничего не возвращает. Объект data возвращается только в функции обратного вызова функции ddbDocClient.query.

Решение его с помощью обратных вызовов: Обеспечьте обратный вызов функции GetTasks:

function GetTasks(tblname, itemname, employee, cb) {
  var params = {
    TableName: 'map_Assignments',
    KeyConditionExpression: '#TaskID = :TaskIDValue',
    ExpressionAttributeNames: {
      '#TaskID': 'TaskID',
    },
    ExpressionAttributeValues: {
      ':TaskIDValue': itemname,
    },
    Limit: 1,
  };
  ddbDocClient.query(params, function (err, data) {
    if (err) {
      console.error(
        'Unable to read item. Error JSON:',
        JSON.stringify(err, null, 2)
      );
      cb(err, null);
    } else {
      console.log('Query succeeded:', JSON.stringify(data, null, 2));
      cb(null, data);
    }
  });
}

и в лямбда-функции:

exports.handler = function (event, context, callback) {
  console.log('Received event:', event);
  // Setting up variables:
  const AssignmentID = event.AssignmentID;
  const Action = event.Action;
  const response = {
    statusCode: 200,
    body: Tasks,
  };

  // Calculating variables:
  GetTasks('map_Assignments', event.TaskID, event.EmployeeNetworkID, function (
    err,
    data
  ) {
    if (data)
      callback(null, JSON.stringify(data.Items[0].TableWithTaskDetails));
    else callback(err, null);
  });
};

...