从AWS Lambda调用DynamoDB对象上的getItem(),为什么我的回调不执行?

时间:2017-12-04 13:28:01

标签: amazon-dynamodb aws-lambda aws-sdk-nodejs

我正在尝试从DynamoDB数据库中获取一个项目。我的代码目前的编写方式,我无法从DynamoDB中检索任何数据。我一定做错了,因为就我的测试而言,我的回调没有被调用。

我昨天花了一整天的时间在这上面,并且自从我今天早上醒来以来一直没有成功修补它。

如果有人能够提供我在这里做错的见解,我将非常感激。提前感谢大家!

最后注意事项:Lambda函数本身的超时设置为5分钟。所以我不认为Lambda函数在db查询返回之前是超时的。当我运行该功能时,它会在片刻之后退出。

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

const dynamodb = new AWS.DynamoDB();
var response = null;
var test = false;

function getFromDB(callback) {
  const params = {
    TableName: process.env['DB_TABLE_NAME'] // evaluates to 'test-table',
    Key: {
      "id": {
        S: postId // evaluates to a big string, pulling it in from an SNS message. Verified it with console.log(). It stores the expected value.
      }
    }
  };
  dynamodb.getItem(params, function(err, data) {
    if (err) callback(data, true);           // an error occurred
    else     callback(data, true);           // successful response
  });
}

getFromDB((data, isCalled) => {
    response = data;
    test = isCalled;
});

console.log(data); // evaluates to null
console.log(test); // evaluates to false

3 个答案:

答案 0 :(得分:2)

我认为正在发生的事情是Lambda调用该函数,但它不会等待回调,因此它认为它已完成并退出。

我认为我有类似的问题并通过使用Bluebird和async / await来解决它。

如果您需要,我可以从我的代码中提供一个代码段

答案 1 :(得分:1)

你加载了SDK吗?我在你的代码片段中看不到它

// Load the AWS SDK for Node.js
var AWS = require('aws-sdk');
// Set the region 
AWS.config.update({region: 'REGION'});

编辑:包含的区域

答案 2 :(得分:1)

我曾经遇到过类似的问题。 我在下面的语句中删除了async来解决:

rails new <appname> --api -d mysql


  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: 
  socket: /var/run/mysqld/mysqld.sock