Fakabbir Amin
Fakabbir Amin

Reputation: 1029

API works randomly while putting data into dynamoDB

I'm trying to put data into Dynamodb using serverless deployment. I have added the permission to write to Dynamodb.

The api is always sending {"message": "Internal server error"} but is able to put the data into db once if tried 5,6 times.

Following is the serverless.yaml config

    handler: dynamoUpdate.handler
    events:
      - http:
          path: /createdbentry
          method: get
          cors: true

Following is the code:

const AWS = require('aws-sdk')
AWS.config.update({ region: process.env.REGION || 'us-east-1' })

var ddb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

exports.handler = async (event) => {
  return await createDBEntry("i123","Working");
}

const sendRes = (status, body) => {
  var response = {
    statusCode: status,
    headers: {
      "Content-Type": "application/json"
    },
    body: body
  };
  return response;
};

const createDBEntry = async function(id,result) {
  var params = {
    TableName: 'emplist',
    Item: {
      'ID' : {S:id},
      'Summary':{S: result},
    }
  };

    ddb.putItem(params, function(err, data) {
      console.log("Here comes me.")
      if (err) {
        console.log("Opps Error");
        return sendRes(403,err);
      } else {
        console.log("Complete")
        return sendRes(200,data);
      }
    });
  }

How can it be resolved ?

Upvotes: 0

Views: 45

Answers (1)

cementblocks
cementblocks

Reputation: 4596

The problem is you are not returning any promise or awaiting anything async in your function called createDBEntry. Thus your handler returns undefined which makes apigateway return 500 internal server error.

You are mixing callbacks and async/await. Your createDBEntry function should look like this.

const createDBEntry = async function(id, result) {
  var params = {
    TableName: 'emplist',
    Item: {
      'ID' : {S:id},
      'Summary':{S: result},
    }
  };

  try {
    let data = await ddb.putItem(params).promise()
    return sendRes(200, JSON.stringify(data))
  } catch (err) {
    console.log("Oops Error");
    return sendRes(403, err.toString());
  }
}

When you return from an async handler in lambda the current execution environment is frozen immediately (unlike when you use a non-async handler with a callback). This is why most of the time the writes to the database does not succeed.

Upvotes: 1

Related Questions