0

i'm writing a serverless application and im having trouble when invoking lambda function inside function. Two functions are working as expected separately. when i try to execute function B from function A it gives following error.

Unexpected token u in JSON at position 0

here is my code and i'm sure my payload is not passing to second function, how can i resolve it? Function A

module.exports.create = (event, context, callback) => {
  console.log('inside');
  const timestamp = new Date().getTime();
  console.log(JSON.parse(event.body));
  const data = JSON.parse(event.body);

  var jsonObj = {'user_avatar' : 'data.user_avatar',
                'name' : 'data.name'}
  const params2 = {
  FunctionName: "serverless-rest-api-with-dynamodb-dev-uploadImage",
  InvocationType: "RequestResponse",
  LogType: 'Tail',
  Payload: JSON.stringify(jsonObj)
  };

  lambda.invoke(params2, function (err, data) {
  if (err) {
    console.log('error : ' + err)
    callback(err, null)
  } else if (data) {
    const response = {
      statusCode: 200,
      body: JSON.parse(data.Payload)
    }
    callback(null, response)
  }
})

  const params = {
    TableName: process.env.BANK_TABLE,
    Item: {
      id: uuid.v1(),
      bankName: data.bankName,
      bankUrl: data.bankUrl,
      bankCardUrl: data.bankCardUrl,
      bankLogoID: data.bankLogoID,
      createdAt: timestamp,
      updatedAt: timestamp,
    },
  };

  // write the offers to the database
  dynamoDb.put(params, (error) => {
    // handle potential errors
    if (error) {
      console.error(error);
      callback(null, {
        statusCode: error.statusCode || 501,
        headers: { 'Content-Type': 'text/plain' },
        body: 'Couldn\'t create the offer item.',
      });
      return;
    }
    console.log('setting callback');
    // create a response
    const response = {
      statusCode: 200,
      body: JSON.stringify(params.Item),
    };
    callback(null, response);
  });
};

Function B

module.exports.create = (event, context, callback) => {
  console.log('staring');
    console.log(JSON.parse(event.body));
     let encodedImage =JSON.parse(event.body).user_avatar;
     let decodedImage = Buffer.from(encodedImage, 'base64');
     var filePath = "avatars/" + JSON.parse(event.body).name + ".jpg"
     var params = {
       "Body": decodedImage,
       "Bucket": "imageuploads",
       "Key": filePath
    };
    s3.upload(params, function(err, data){
       if(err) {
           callback(err, null);
       } else {
           let response = {
        "statusCode": 200,
        "headers": {
            "my_header": "my_value"
        },
        "body": JSON.stringify(data),
        "isBase64Encoded": false
    };
           callback(null, response);
    }
    });

};
2
  • You check your log. is console.log('staring') is log when you call lamda B from A Commented Oct 13, 2018 at 7:52
  • What line does that error occur at please? Commented Oct 13, 2018 at 10:28

4 Answers 4

1

The error you get:

Unexpected token u in JSON at position 0

is usually due to a malformed JSON. Following the JSON Syntax from W3Schools:

JSON names require double quotes. JavaScript names don't.

so your jsonObj should be:

var jsonObj = {"user_avatar" : data.user_avatar,
                "name" : data.name}

Also, note that data.user_avatar and data.name are variables and they shouldn't have quotes.

Sign up to request clarification or add additional context in comments.

Comments

0

The problem is in the Payload you're sending from A to B.

(Note that JSON.parse(undefined) is almost always the culprit behind SyntaxError: Unexpected token u in JSON at position 0).

Function B, Line 3 says: console.log(JSON.parse(event.body));

However, your payload from A (A, Line 12) is: {'user_avatar' : 'data.user_avatar', 'name' : 'data.name'}.

This means that event = JSON.stringify({'user_avatar' : 'data.user_avatar', 'name' : 'data.name'}) and event.body === undefined, which is why when you try and JSON.parse(event.body) you get your error.

To make this work you need to change A line 7 to:

var jsonObj = { body: { user_avatar: 'data.user_avatar', name: 'data.name' } };

I suspect it's working when you invoke separately because you're either invoking using API Gateway (which has an event shape of { body: ...data }, or your test body in the console has something similar.)

Comments

0

If you are invoking your lambda function internally (for an unit test, for example), you should make sure you send it as a json http format.

create({body: JSON.stringify(myBodyObject)}, null, callBack)

Comments

0

You have to change request Body.

const data = JSON.parse(event.body);

var jsonObj = {
  body: { //add body
    'user_avatar': data.user_avatar, //remove single quotes
    'name': data.name //remove single quotes
  }
}
const params2 = {
  FunctionName: "serverless-rest-api-with-dynamodb-dev-uploadImage",
  InvocationType: "RequestResponse",
  LogType: 'Tail',
  Payload: JSON.stringify(jsonObj)
};

lambda.invoke(params2, function(err, data) {
  if (err) {
    console.log("error : " + err);
    callback(err, null);
  } else if (data) {
    const response = {
      statusCode: 200,
      body: JSON.parse(data.Payload)
    };
    callback(null, response);
  }
});

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.