pv250021
pv250021

Reputation: 115

Reading Event Parameters AWS lambda

I have a lambda function (Node.js 4.3) as below:

exports.handler = function(event, context, callback) {
    console.log('Received event:', JSON.stringify(event, null, 2));
    var greeter = 'World';
    if (event.greeter && event.greeter!=="" && event.greeter1 && event.greeter1!=="") {
        console.log('Received 1');
        greeter =  event.greeter + event.greeter1 ;
    } else if (event.body && event.body !== "") {
         console.log('Received Body');
        var body = JSON.parse(event.body);
        if (body.greeter && body.greeter !== "") {
            greeter = body.greeter;
        }
    } else if (event.queryStringParameters && event.queryStringParameters.greeter && event.queryStringParameters.greeter !== "") {
        greeter = event.queryStringParameters.greeter;
    } else if (event.headers && event.headers.greeter && event.headers.greeter != "") {
        greeter = event.headers.greeter;
    }
    res.body = "Hello, " + greeter + "!";
    callback(null, res);
};

It is working fine when I test the function using test console and it gives me a proper output as below:

Response:
{
  "statusCode": 200,
  "headers": {
    "Content-Type": "*/*"
  },
  "body": "Hello, maximJane!"
}

However, when I try to test it using my API Gateway (AWS Lambda Proxy Integrations in API Gateway ) it just considers one arguement basically 'greeter'. 'greeter1' is not considered at all.

I tried all options but somehow it is reading only 1 argument.

Upvotes: 3

Views: 10316

Answers (1)

RredCat
RredCat

Reputation: 5421

AWS Lambda automatically monitors Lambda functions on your behalf, reporting metrics through Amazon CloudWatch. You could check it (go to monitoring Tab on lambda function, then click on 'View on CloudWatch'). You will see that event has 'greeter' parameter only ( console.log('Received event:', JSON.stringify(event, null, 2)); prints to log as well).

It happened because you haven't mapped every one of the parameters on your Gateway API. You could do it in 'Integration Request'/'Mapping Template' of your method's properties.

enter image description here

Check out how to map it in API Gateway Mapping Template Reference article, in the 'Accessing the $input Variable' section.

enter image description here

Your template should be something like next example:

{
    "greeter": "$input.params('greeter')",
    "greeter1": "$input.params('greeter1')",
    "Data": $input.json('$')
}
  • $input.params - map data from param
  • $input.json('$') - map data from request body (if it is post or put)

Upvotes: 4

Related Questions