Neewd
Neewd

Reputation: 93

DynamoDB : Query always returning null

I am quite new on DynamoDB, I just create a table where I inserted some dummy rows just to test the read / write functions.

enter image description here

Here is my data.

I create a Lambda to access these data, via Partition Key ok Sort Key but I ended up with a null return every time :'(

Here is the code of my 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
            });
        }
    })

};

I first thought it was lack of access to the table but it seems I have the right permissions.

enter image description here

I am quite sure it's a dummy problem but i can't figure it out ...

Thanks for help :D

Upvotes: 0

Views: 5449

Answers (1)

Thales Minussi
Thales Minussi

Reputation: 7245

Your Lambda function is async but your code uses callbacks. By the time the callback is reached, your function has already been terminated because it ran asychronously.

Rather than using the outdated, confusing callback approach, just stick with async/await. The AWS SDK for Node.js already provides a .promise() method which you can call on asynchronous methods that use a callback, making it seamless to await on them.

That said, change your code to:

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

};

Since you are already using the DocumentClient API, you don't need to specify the types ("S", "N", etc) when querying.

Also, make sure that Partition_Key really is your partition key. You use the name you defined in your table, no HashKey nor PartitionKey, meaning if you called your Hash Key id, then id should be used.

Upvotes: 8

Related Questions