【问题标题】:AWS Lambda Dynamo AWS SDK Node.js Query Method IssueAWS Lambda Dynamodb AWS SDK Node.js 查询方法问题
【发布时间】:2018-11-22 20:46:28
【问题描述】:

您好,我有以下基于 Node.js 的 Lambda 代码。我无法调用查询方法来检索数据。

输入:{ key: 'value' } -- 使用测试事件输入。

var AWS = require('aws-sdk');
AWS.config.update({region: 'us-east-2'});
var ddb = new AWS.DynamoDB.DocumentClient({apiVersion: '2012-08-10'});

exports.handler = async (event, context) => {
    const params = {
        TableName: 'Chapter',
        IndexName: 'subjectId-index', // Global Secondary Index
        KeyConditionExpression: 'subjectId = :subjectId',
        ExpressionAttributeValues: {
            ':subjectId': event.key,
        },
    };
    console.log(JSON.stringify(params));
    ddb.query(params, (err, data) => {
        // Console.log('Not executing this part !!!')
        if (err) console.log(err);
        console.log(data);
    });
};

甚至没有调用查询方法或记录任何错误。我真的需要一些帮助。

【问题讨论】:

  • 您在 Lambda 配置中使用的是哪个版本的 nodejs?

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


【解决方案1】:

由于您有控制台日志,因此您可以使用 cloudwatch 调试代码以检查您的 lambda 日志。

您可以选择您的 lambda,如果您看到任何执行日志,您可以单击以获取更多详细信息,您会在那里找到您的控制台日志

调用 context.done

您可以尝试的示例程序。我只是写了没试过

var AWS = require('aws-sdk');
AWS.config.update({ region: 'us-east-2' });
var ddb = new AWS.DynamoDB.DocumentClient({ apiVersion: '2012-08-10' });

const executeQuery = (params) => {
    return new Promise(function (resolve, reject) {
        ddb.query(params, (err, data) => {
            if (err) reject(err);
            resolve(data);
        });
    });
}
exports.handler = async (event, context) => {
    const params = {
        TableName: 'Chapter',
        IndexName: 'subjectId-index', // Global Secondary Index
        KeyConditionExpression: 'subjectId = :subjectId',
        ExpressionAttributeValues: {
            ':subjectId': event.key,
        },
    };
    console.log(JSON.stringify(params));
    executeQuery(params).then((data) => {
        console.log('sucess');
        context.done(data);
    }).catch((err) => {
        console.log('Error occurred');
        context.done(error);
    })
};

【讨论】:

  • 这与 cloudWatch Logs 无关。这是有效的,当我将其设置为发电机数据库表的触发器时,我可以在那里看到日志。但是我的查询函数没有被调用。
  • 您在完成任务后没有使用回调 contex.done。请阅读我对代码库的回答
  • 不需要使用promise。事件文档不需要。我只需要知道为什么我的 dynamo 客户端对象的 query() 方法没有执行。
  • lambda 函数需要调用 contex.done 等待执行,否则 lambda 将在超时时退出,默认时间为 3s您应该能够看到日志
  • 目前正在使用 node.js v8.x.x 在 aws 在线编辑器中对其进行测试
猜你喜欢
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多