【问题标题】:DynamoDB query function is not working while trying to access the data尝试访问数据时 DynamoDB 查询功能不起作用
【发布时间】:2020-01-22 21:42:02
【问题描述】:

所以我尝试从 dynamodb 获取数据,使用下面的代码,我得到 null 并且在调用查询函数后没有显示日志。

我在本地试了一下,它在本地工作,只是通过lambda函数它不起作用,我还检查了我的角色是否有读取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 方法(db)的代码

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);
        });
    });
};

【问题讨论】:

  • 提供你使用getAnswerToQuestion函数的地方。
  • 我看到你把数据放到callback函数的第一个参数里了。
  • 我在第二个参数中进行了修改,从回调中获取数据(但响应为空),并且您要求的代码已被编辑
  • 这仍然是一个async 问题。 return await new Promise
  • 您的表中可能没有任何键值为hsa 的项目。只需尝试获取更多信息以进行调试,记录您的查询参数console.log("Trying to query dynamodb", params);。在resolve(response);之后不要做任何事情

标签: node.js amazon-web-services aws-lambda amazon-dynamodb


【解决方案1】:

我敢打赌,这是人们在将 Node.js 与 Lambda 结合使用时最常见的问题。

当 Node.js Lambda 到达主线程的末尾时,它会结束所有其他线程。当它到达处理程序的末尾时,它会停止所有正在运行的并发 Promise 或异步调用。

为确保 lambda 不会过早终止这些线程,请使用 await 等到这些承诺完成。

在您的情况下,对任何 AWS 请求使用 .promise() 方法,然后使用 await 它们:

try {
    const data = await dynamodb.query(params).promise();
    console.log(data.Items);
    callback(data.Items[0]);
}  catch (err) {
    console.log(err);
    callback(err);
}

【讨论】:

  • 我试过这个,但它不起作用,仍然没有得到任何数据,甚至尝试为该函数创建一个promise并在调用这个通过promise解决的函数时尝试异步等待,但它仍然成功不工作
猜你喜欢
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多