【问题标题】:DynamoDB getItem call not giving a responseDynamoDB getItem 调用未给出响应
【发布时间】:2023-03-29 18:30:01
【问题描述】:

我正在尝试按照 AWS 教程阅读 AWS Lambda 中的基本 DynamoDB 表。我有一些基本代码,似乎运行正常(我没有看到任何错误记录),但我无法获得任何输出:

const AWS = require('aws-sdk');
AWS.config.update({region: 'eu-west-1'});
const ddb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

function readData(){

console.log("In the readData() function");

var params = {
    TableName: "desks",
    Key: {
        "desk_id": {N:'1'}
    }
};
console.log("Set params");
// Call DynamoDB to read the item from the table
ddb.getItem(params, function(err, data) {
    console.log("In getItem callback function");
    if (err) {
        console.log("Error", err);
    }
    else {
        console.log("Success", data.Item);
    }
});
console.log("Completed call");
}

当我上面的函数被调用时,日志显示输出“设置参数”和“完成调用”,但就像回调函数没有被执行。我是否遗漏了执行流程的某些内容?

编辑:我使用的是 Node.js 8.10,并且我相信我已经设置了适当的角色权限(对数据库的完全访问权限)。

【问题讨论】:

  • 哪个节点版本?您是否已将相关角色附加到 lambda 以从 DyanmoDB 获取密钥?
  • 您的“已完成通话”日志实际上是在 ddb.getItem 通话仍在运行时发生的。您需要研究并了解 NodeJS 中的异步调用是如何工作的。在这之后的日志中还有什么?函数最终会超时吗?还是会引发某种类型的日志错误?另外,您是否已将 Lambda 函数配置为在 VPC 中运行?
  • 已更新节点版本和角色 - 相信这些都很好。我对 AWS 比较陌生,但根本没有尝试过使用 VPC 做任何聪明的事情。我刚刚创建了函数和相应的 dynamoDB。我知道异步调用是如何工作的(ish),但实际上日志中没有其他内容 - 没有错误,没有超时,没有任何内容。
  • 最终,我要做的是将它连接到一个 API 触发器(我已经让那个位工作)并返回查询的输出。我怀疑问题与异步调用有关 - 有没有办法让进程等待 DynamoDB 的响应?在返回 DB 响应之前,lambda 函数是否已经执行并关闭,并且在执行查询时该函数不再存在?
  • 嗨大卫,你试过我的解决方案了吗?如果我能提供帮助,请告诉我。

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


【解决方案1】:

好的,所以我想通了,您可以使用DocumentClient,而不是使用特定的 API 版本。

关于 AWS.DynamoDB.DocumentClient:

文档客户端简化了对 Amazon DynamoDB 中项目的处理 通过抽象出属性值的概念。这种抽象 注释作为输入参数提供的本机 JavaScript 类型,如 以及将带注释的响应数据转换为原生 JavaScript 类型。

关于get函数:

返回具有给定主键的项目的一组属性 委托给 AWS.DynamoDB.getItem()。

代码sn-p:

const AWS = require('aws-sdk');

const db = new AWS.DynamoDB.DocumentClient({
   region : 'REGION' 
});


function getItem(){

const params = {
  TableName : 'TABLE-NAME',
  Key: {
    'PRIMARY-KEY':'PRIMARY-KEY-VALUE'
  }
};
    
  db.get(params, (err, data) => {
  if (err){
    console.log("Error:", err);
  } 
  else{
    console.log("Success:", data.Item);
    
  } 
  console.log("Completed call");
});

}

exports.handler = (event) => {
    
 getItem()
 
};

顺便说一句,您可以使用 DynamoDB UI 中的扫描操作,扫描操作返回一个或多个与您指定的过滤器匹配的项目。

我使用它只是为了确保我输入的变量在使用 lambda 函数之前是正确的。

【讨论】:

  • 标记为已接受的答案,因为它确实有效,但事实证明,很大一部分问题与我管理不善的回调有关。一旦我在我的方法调用中引入了 Promise,上面的代码就起作用了。
【解决方案2】:

我遇到了和你一样的错误,正如你在评论中所说,我能够通过使用承诺而不是回调来修复它。

在我的情况下,我调用 getItem 两次,使用相同的对象(或至少,将字符串化为相同的对象)。第一次调用会成功(回调会被调用),但第二次调用不会(回调永远不会被调用,我的代码会挂起)。我不知道这是否与缓存有关,还是什么。

顺便说一句,我注意到您没有调用处理程序的 callback 函数,这可能是另一个问题。

const AWS = require('aws-sdk');
AWS.config.update({region: 'eu-west-1'});
const ddb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

function readData(done){

  console.log("In the readData() function");

  var params = {
    TableName: "desks",
    Key: {
        "desk_id": {N:'1'}
    }
  };
  console.log("Set params");
  // Call DynamoDB to read the item from the table
  ddb.getItem(params).promise()
    .then((data) => console.log("Success", data.Item))
    .catch((err) => console.log("Error", err))
    .finally(done);

  // There's no equivalent for this, so I left it out.
  // console.log("In getItem callback function");

  console.log("Completed call");

}

exports.handler = (event, context, callback) => {
    
  readData(callback);
 
};

【讨论】:

    猜你喜欢
    • 2020-11-04
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 2021-06-03
    • 2018-11-08
    相关资源
    最近更新 更多