Home > Software design >  Unable to parse the request object
Unable to parse the request object

Time:01-09

From, my postman, I'm passing the following in the Body as raw JSON

{
    "profile": {
      "emailAddress": "[email protected]",
      "givenName": "John",
      "firstName": "John",
      "lastName": "Thomas",
      "profileePic": null
    }
}

However, my JavaScript code is breaking as I'm unable to parse the attributes like emailAddress, givenName within the profile object. I'm getting following error when I see it on my AWS CloudWatch

2022-01-08T18:52:33.723 05:30   START RequestId: d0e38c52-a7d6-40dd-afac-c06d2ab201d8 Version: $LATEST

2022-01-08T18:52:33.834 05:30   info: event: {"body":"{\n \"profile\": {\n \"emailAddress\": \"[email protected]\",\n \"givenName\": \"John\",\n \"firstName\": \"John\",\n \"lastName\": \"Thomas\",\n \"profileePic\": null\n }\n}\n","headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate, br","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":"IN","Content-Type":"application/json","Host":"rukq81brsl.execute-api.ap-southeast-1.amazonaws.com","Postman-Token":"f206f469-e8fc-44c7-ab50-91082c0c7073","User-Agent":"PostmanRuntime/7.28.4","Via":"1.1 a0182542bde1ac9ec73dcf86004da8fc.cloudfront.net (CloudFront)","X-Amz-Cf-Id":"5Q-dEIt0WSWNAbpwXgapJNyt-zbVAyEjTDMVt_OONS4swLH1JJ_g9g==","X-Amzn-Trace-Id":"Root=1-61d99018-6935ebc455a3ca2b69a82bd2","X-Forwarded-For":"223.190.90.66, 64.252.163.138","X-Forwarded-Port":"443","X-Forwarded-Proto":"https"},"httpMethod":"POST","isBase64Encoded":false,"multiValueHeaders":{"Accept":["*/*"],"Accept-Encoding":["gzip, deflate, br"],"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":["IN"],"Content-Type":["application/json"],"Host":["rukq81brsl.execute-api.ap-southeast-1.amazonaws.com"],"Postman-Token":["f206f469-e8fc-44c7-ab50-91082c0c7073"],"User-Agent":["PostmanRuntime/7.28.4"],"Via":["1.1 a0182542bde1ac9ec73dcf86004da8fc.cloudfront.net (CloudFront)"],"X-Amz-Cf-Id":["5Q-dEIt0WSWNAbpwXgapJNyt-zbVAyEjTDMVt_OONS4swLH1JJ_g9g=="],"X-Amzn-Trace-Id":["Root=1-61d99018-6935ebc455a3ca2b69a82bd2"],"X-Forwarded-For":["223.190.90.66, 64.252.163.138"],"X-Forwarded-Port":["443"],"X-Forwarded-Proto":["https"]},"multiValueQueryStringParameters":null,"path":"/user/validation","pathParameters":null,"queryStringParameters":null,"requestContext":{"accountId":"195725532069","apiId":"rukq81brsl","domainName":"rukq81brsl.execute-api.ap-southeast-1.amazonaws.com","domainPrefix":"rukq81brsl","extendedRequestId":"LoNz7HiuyQ0FlIA=","httpMethod":"POST","identity":{"accessKey":null,"accountId":null,"caller":null,"cognitoAuthenticationProvider":null,"cognitoAuthenticationType":null,"cognitoIdentityId":null,"cognitoIdentityPoolId":null,"principalOrgId":null,"sourceIp":"223.190.90.66","user":null,"userAgent":"PostmanRuntime/7.28.4","userArn":null},"path":"/dev/user/validation","protocol":"HTTP/1.1","requestId":"b95ffa2b-12eb-43fe-8f36-87a071713268","requestTime":"08/Jan/2022:13:22:32  0000","requestTimeEpoch":1641648152994,"resourceId":"gso8zl","resourcePath":"/user/validation","stage":"dev"},"resource":"/user/validation","service":"user-service","stageVariables":null}

2022-01-08T18:52:33.834 05:30   info: event.body:: {"service":"user-service"}

2022-01-08T18:52:33.834 05:30   info: event.body.profile:: {"service":"user-service"}

2022-01-08T18:52:33.834 05:30   info: profile: {"service":"user-service"}

2022-01-08T18:52:33.835 05:30   2022-01-08T13:22:33.835Z d0e38c52-a7d6-40dd-afac-c06d2ab201d8 ERROR Invoke Error {"errorType":"TypeError","errorMessage":"Cannot read property 'emailAddress' of undefined","stack":["TypeError: Cannot read property 'emailAddress' of undefined"," at Runtime.exports.lambdaHandler [as handler] (/var/task/app.js:31:34)"," at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)"]}

2022-01-08T18:52:33.893 05:30   END RequestId: d0e38c52-a7d6-40dd-afac-c06d2ab201d8

What is strange more about is that event.body is getting parsed to {"service":"user-service"} I was expecting profile object here.

This is my Lambda (written in JavaScript using Node.js runtime) code for reference where I'm trying to parse the event

exports.lambdaHandler = async (event, context) => {
  logger.info('event:', event);
  let body, data;
    let statusCode = 200;
    const headers = {
      'Content-Type': 'application/json',     
      'Access-Control-Allow-Headers': 'Content-Type',
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Methods': '*'
    };

    logger.info('event.body::', event.body);
    logger.info('event.body.profile::', event.body.profile);

    const profile = event.body.profile;
    logger.info('profile:', profile);

    const emailAddress = profile.emailAddress;
    const hash = md5(emailAddress.trim().toLowerCase());

I tried to debug a lot but could not find anything concrete yet.

CodePudding user response:

The body in your Event is a String, not an Object, you first have to parse it using the JSON.parse() function, and then extract the profile from the returned Object

const event = {"body":"{\n \"profile\": {\n \"emailAddress\": \"[email protected]\",\n \"givenName\": \"John\",\n \"firstName\": \"John\",\n \"lastName\": \"Thomas\",\n \"profileePic\": null\n }\n}\n","headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate, br","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":"IN","Content-Type":"application/json","Host":"rukq81brsl.execute-api.ap-southeast-1.amazonaws.com","Postman-Token":"f206f469-e8fc-44c7-ab50-91082c0c7073","User-Agent":"PostmanRuntime/7.28.4","Via":"1.1 a0182542bde1ac9ec73dcf86004da8fc.cloudfront.net (CloudFront)","X-Amz-Cf-Id":"5Q-dEIt0WSWNAbpwXgapJNyt-zbVAyEjTDMVt_OONS4swLH1JJ_g9g==","X-Amzn-Trace-Id":"Root=1-61d99018-6935ebc455a3ca2b69a82bd2","X-Forwarded-For":"223.190.90.66, 64.252.163.138","X-Forwarded-Port":"443","X-Forwarded-Proto":"https"},"httpMethod":"POST","isBase64Encoded":false,"multiValueHeaders":{"Accept":["*/*"],"Accept-Encoding":["gzip, deflate, br"],"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":["IN"],"Content-Type":["application/json"],"Host":["rukq81brsl.execute-api.ap-southeast-1.amazonaws.com"],"Postman-Token":["f206f469-e8fc-44c7-ab50-91082c0c7073"],"User-Agent":["PostmanRuntime/7.28.4"],"Via":["1.1 a0182542bde1ac9ec73dcf86004da8fc.cloudfront.net (CloudFront)"],"X-Amz-Cf-Id":["5Q-dEIt0WSWNAbpwXgapJNyt-zbVAyEjTDMVt_OONS4swLH1JJ_g9g=="],"X-Amzn-Trace-Id":["Root=1-61d99018-6935ebc455a3ca2b69a82bd2"],"X-Forwarded-For":["223.190.90.66, 64.252.163.138"],"X-Forwarded-Port":["443"],"X-Forwarded-Proto":["https"]},"multiValueQueryStringParameters":null,"path":"/user/validation","pathParameters":null,"queryStringParameters":null,"requestContext":{"accountId":"195725532069","apiId":"rukq81brsl","domainName":"rukq81brsl.execute-api.ap-southeast-1.amazonaws.com","domainPrefix":"rukq81brsl","extendedRequestId":"LoNz7HiuyQ0FlIA=","httpMethod":"POST","identity":{"accessKey":null,"accountId":null,"caller":null,"cognitoAuthenticationProvider":null,"cognitoAuthenticationType":null,"cognitoIdentityId":null,"cognitoIdentityPoolId":null,"principalOrgId":null,"sourceIp":"223.190.90.66","user":null,"userAgent":"PostmanRuntime/7.28.4","userArn":null},"path":"/dev/user/validation","protocol":"HTTP/1.1","requestId":"b95ffa2b-12eb-43fe-8f36-87a071713268","requestTime":"08/Jan/2022:13:22:32  0000","requestTimeEpoch":1641648152994,"resourceId":"gso8zl","resourcePath":"/user/validation","stage":"dev"},"resource":"/user/validation","service":"user-service","stageVariables":null}

let {profile} = JSON.parse(event.body) // extract profile from returned Object

console.log(profile.givenName)

  •  Tags:  
  • Related