Gaurav Narula
Gaurav Narula

Reputation: 472

How to handle query string Node Js AWS Lambda

I am using AWS Lambda to create a fetch API by passing a query parameter eg. vendorId, but in some case, I need whole data without passing the query parameter and in that case, my code is broken. Let me know how I can handle the query parameter.

  var mysql=require('mysql'); //Require whatever connector you need.

  function getConnection()
   {
        var params={
           host     : 'myhostinfo',
           user     : 'myuser',
            password : 'mypwd',
           database : 'mydb'
    };

return mysql.createConnection(params);
}
      //This is your handler.
     exports.handler=function(event, context,callback)
    {

 //This is declared inside the handler: it is guaranteed to never be reused!.
   var connection=getConnection();
var fetchvendors="";


if(event.query.vendorid)
{   
    var vendorid=parseInt(event.query.vendorid);
    fetchvendors="SELECT v.*,c.vcategoryname FROM `tbl_vendors` v LEFT 
 OUTER JOIN tbl_demo_categories c ON v.vendorcatid=c.vcategoryid WHERE 
  v.vendorid="+vendorid;
}

else{
       fetchvendors="SELECT v.*,c.vcategoryname FROM `tbl_vendors` v LEFT 
OUTER JOIN tbl_demo_categories c ON v.vendorcatid=c.vcategoryid WHERE 
 status=1";
}
     connection.query(fetchvendors, function (error, results, fields) {
          if (error) {
            connection.destroy();
             throw error;
          } else {
              // connected!
             callback(null, results);
             connection.end();
        }
     });
  }

here is the result

          Response:
        {
              "errorMessage": "RequestId: 42fd18b1-598c-4f7e-b93b- 
                b146777772b2 
            Process exited before completing request"
               }

          Request ID:
              "42fd18b1-598c-4f7e-b93b-b146777772b2"

             Function Logs:
            START RequestId: 42fd18b1-598c-4f7e-b93b-b146777772b2 Version: 
        $LATEST
             2019-04-04T10:48:34.959Z   42fd18b1-598c-4f7e-b93b- 
          b146777772b2  TypeError: Cannot read property 'vendorid' of 
                       undefined

Upvotes: 18

Views: 36866

Answers (5)

Robert
Robert

Reputation: 20286

I know this one is old but for me it worked when I used the following

event.queryStringParameters?.vendorid

Notice ?. operator because queryStringParameters may not exist in the query string

Upvotes: 2

Sehrish Waheed
Sehrish Waheed

Reputation: 1565

You can use

import middy from "@middy/core";
import httpEventNormalizer from "@middy/http-event-normalizer";

middy(handler).use([
  httpEventNormalizer()
])

then get query from event.queryStringParameters?.queryParameterName

middy will remove query parameters if their value is null from queryStringParameters

Upvotes: 0

Vikash_Singh
Vikash_Singh

Reputation: 1896

you should put pre-check for existence of object and its keys like this :

if(event && event.query && event.query.vendorid)

Upvotes: 9

Ankit Kumar Rajpoot
Ankit Kumar Rajpoot

Reputation: 5600

Try this -

event.queryStringParameters.pincode

Upvotes: 6

Sasank Mukkamala
Sasank Mukkamala

Reputation: 1574

If you are using API Gateway as the trigger to the lambda function, the query paramters are available at event.queryStringParameters. So you should be doing event.queryStringParameters.vendorid if vendorid is the GET param. Here's a full sample of API Gateway Proxy request to Lambda.

{
  "body": "eyP0ZXQ0IjoiYm9keSJ9",
  "resource": "/{proxy+}",
  "path": "/path/to/resource",
  "httpMethod": "POST",
  "isBase64Encoded": true,
  "queryStringParameters": {
    "foo": "bar"
  },
  "pathParameters": {
    "proxy": "/path/to/resource"
  },
  "stageVariables": {
    "baz": "qux"
  },
  "headers": {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Accept-Encoding": "gzip, deflate, sdch",
    "Accept-Language": "en-US,en;q=0.8",
    "Cache-Control": "max-age=0",
    "CloudFront-Forwarded-Proto": "https",
    "CloudFront-Is-Desktop-Viewer": "true",
    "CloudFront-Is-Mobile-Viewer": "false",
    "CloudFront-Is-SmartTV-Viewer": "false",
    "CloudFront-Is-Tablet-Viewer": "false",
    "CloudFront-Viewer-Country": "US",
    "Host": "1234567890.execute-api.us-east-1.amazonaws.com",
    "Upgrade-Insecure-Requests": "1",
    "User-Agent": "Custom User Agent String",
    "Via": "1.1 08f323deadbeefa7af34d5feb414ce27.cloudfront.net (CloudFront)",
    "X-Amz-Cf-Id": "cDehZQoZnx43VYQb9j2-naCh-9y396Uhbp027Y2JvkCPNLmGJHqlaA==",
    "X-Forwarded-For": "127.0.0.1, 127.0.0.2",
    "X-Forwarded-Port": "443",
    "X-Forwarded-Proto": "https"
  },
  "requestContext": {
    "accountId": "123456789012",
    "resourceId": "123456",
    "stage": "prod",
    "requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef",
    "requestTime": "09/Apr/2015:12:34:56 +0000",
    "requestTimeEpoch": 1428582896000,
    "identity": {
      "cognitoIdentityPoolId": null,
      "accountId": null,
      "cognitoIdentityId": null,
      "caller": null,
      "accessKey": null,
      "sourceIp": "127.0.0.1",
      "cognitoAuthenticationType": null,
      "cognitoAuthenticationProvider": null,
      "userArn": null,
      "userAgent": "Custom User Agent String",
      "user": null
    },
    "path": "/prod/path/to/resource",
    "resourcePath": "/{proxy+}",
    "httpMethod": "POST",
    "apiId": "1234567890",
    "protocol": "HTTP/1.1"
  }
}

Upvotes: 29

Related Questions