DynamoDB:查询始终返回null

时间:2019-07-17 13:06:49

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

我在DynamoDB上还很陌生,我只是创建了一个表,在其中插入了一些虚拟行以测试读/写功能。

enter image description here

这是我的数据。

我通过分区键ok排序键创建了一个Lambda来访问这些数据,但是每次我都返回null:'(

这是我的lambda的代码:

    const dynamodb = new AWS.DynamoDB.DocumentClient({apiVersion: '2012-08-10', region: 'eu-west-1'});

exports.handler = async (event,context,callback) => {
    var params = {
        TableName : "DontMissAPlaceTable",
        KeyConditionExpression: "Partition_Key = :id",
        ExpressionAttributeValues: {
            ":id": {"S" :  "media_001"}
        }
    };
    dynamodb.query(params, function(err, data) {
        if (err) {
            console.log(err, err.stack);
            callback(null, {
                statusCode: '500',
                body: err
            });
        } else {
            console.log(data)
            callback(null, {
                statusCode: '200',
                body: data
            });
        }
    })

};

我首先认为这是无法访问表,但似乎我拥有正确的权限。

enter image description here

我很确定这是一个虚拟问题,但我不知道...

感谢您的帮助:D

1 个答案:

答案 0 :(得分:3)

您的Lambda函数为async,但您的代码使用回调。在到达回调之前,您的函数已经终止,因为它是异步运行的。

不要使用过时的,令人困惑的回调方法,而要坚持使用async/await。适用于Node.js的AWS开发工具包已经提供了.promise()方法,您可以在使用回调的异步方法上调用它,从而使其与await之间实现无缝连接。

也就是说,将您的代码更改为:

const dynamodb = new AWS.DynamoDB.DocumentClient({apiVersion: '2012-08-10', region: 'eu-west-1'});

exports.handler = async (event) => {
    const params = {
        TableName : "DontMissAPlaceTable",
        KeyConditionExpression: "Partition_Key = :id",
        ExpressionAttributeValues: {
            ":id": "media_001"
        }
    };
    return {
      statusCode: 200,
      body: JSON.stringify(await dynamodb.query(params).promise())
    }

};

由于您已经在使用DocumentClient API,因此在查询时无需指定类型(“ S”,“ N”等)。

另外,请确保Partition_Key确实是您的您的分区键。您使用表中定义的名称,而不使用HashKeyPartitionKey,这意味着如果您调用哈希键id,则应使用id