Функция запроса DynamoDB не работает при попытке доступа к данным - PullRequest
1 голос
/ 22 сентября 2019

Итак, я попытался извлечь данные из DynamodB, используя приведенный ниже код, я получаю нулевое значение, и журнал не отображается после вызова функции запроса.

Я пробовал это локально, оно работает только локально,через лямбда-функцию это не работает, я также проверил, есть ли у моей роли разрешение на чтениеТак что я ничего не понимаю в этих

"use strict";

const config = require("./config");
const AWS = require("aws-sdk");

AWS.config.update({
  region: "us-east-1"
});
let dynamodb = new AWS.DynamoDB.DocumentClient({
  region: "us-east-1"
});

var getAnswerToQuestion = (questionKey, callback) => {

  var params = {
    TableName: "genral-questions-db",
    KeyConditionExpression: "#questionKey = :question",
    ExpressionAttributeNames: {
      "#questionKey": "question"
    },
    ExpressionAttributeValues: {
      ":question": String(questionKey)
    }
  };
  console.log("Trying to query dynamodb");

  dynamodb.query(params, (err, data) => {
    if(err) {
      console.log (err)
      callback(err);
    } else {
      console.log(data.Items);
      callback(data.Items[0]);
    }
  });
}

module.exports = {
  getAnswerToQuestion
};

журналах:

Function Logs:
START RequestId: 6adeddbe-4925-4877-a2c0-d20576145224 Version: $LATEST
2019-09-22T17:35:30.088Z    6adeddbe-4925-4877-a2c0-d20576145224    event.bot.name=bcbsri
2019-09-22T17:35:30.088Z    6adeddbe-4925-4877-a2c0-d20576145224    dispatch userId=pn6yexoq87uej2evt9huhilc5f99bhb7, intentName=GenralQuestionIntent
2019-09-22T17:35:30.088Z    6adeddbe-4925-4877-a2c0-d20576145224    GenralQuestionIntent was called - Srinivas
2019-09-22T17:35:30.089Z    6adeddbe-4925-4877-a2c0-d20576145224    have to query the db hsa
2019-09-22T17:35:30.089Z    6adeddbe-4925-4877-a2c0-d20576145224    Trying to query dynamodb
END RequestId: 6adeddbe-4925-4877-a2c0-d20576145224
REPORT RequestId: 6adeddbe-4925-4877-a2c0-d20576145224  Duration: 596.83 ms Billed Duration: 600 ms Memory Size: 128 MB Max Memory Used: 76 MB  Init Duration: 193.27 ms    

, даже не получая ошибку, она просто не возвращает никаких данных.Пожалуйста, помогите мне решить эту проблему

РЕДАКТИРОВАТЬ: вот код, из которого я пытаюсь вызвать метод utils (дБ)

module.exports =  function(intentRequest) { 
    return new Promise((resolve, reject) => {

        // Resolve question key
        const questionKey = intentRequest.currentIntent.slots.QuestionKey;

        let speechText;

        console.log('have to query the db', questionKey);

        utils.getAnswerToQuestion(questionKey, res => {
            if(res ) {
                speechText = res.answer;
            } else {
                speechText = "Sorry, details about " + questionKey + " was not found";
            }

            const response = {
                fullfilmentState: 'Fulfilled',
                message: { contentType: 'PlainText', content: speechText }
            };
            console.log(response);

            resolve(response);
            return lexResponses.close(intentRequest.sessionAttributes, response.fullfilmentState, response.message);
        });
    });
};

1 Ответ

1 голос
/ 22 сентября 2019

Держу пари, что это самая распространенная проблема, с которой люди сталкиваются при использовании Node.js с Lambda.

Когда лямбда Node.js достигает конца основного потока, он завершает все остальные потоки.Когда он достигает конца обработчика, он останавливает все выполняющиеся параллельные обещания или асинхронные вызовы.

Чтобы убедиться, что лямбда не завершает преждевременно эти потоки, дождитесь завершения этих обещаний, используя await.

В вашем случае используйте метод .promise() с любыми запросами AWS, а затем await их:

try {
    const data = await dynamodb.query(params).promise();
    console.log(data.Items);
    callback(data.Items[0]);
}  catch (err) {
    console.log(err);
    callback(err);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...