Home > database >  JavaScript Lambda CloudWatch logs indicate its handler is not loading functions defined in other sou
JavaScript Lambda CloudWatch logs indicate its handler is not loading functions defined in other sou

Time:12-03

AWS Lambda (JavaScript/TypeScript) here. I have the following Lambda handler:

import { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda';
import { User, allUsers } from './users';
import { Commentary } from './domain';
import { dynamoDbClient } from './store';
import { PutCommand } from "@aws-sdk/client-dynamodb";

export const lambdaHandler = async (event: APIGatewayProxyEvent): Promise<APIGatewayProxyResult> => {
    try {

        let status: number = 200;
        let commentary: Commentary = JSON.parse(event.body);
        console.log("deserialized this into commentary");
        console.log("and the deserialized commentary has content of: "   commentary.getContent());
        provideCommentary(event.body);
        responseBody = "\"message\": \"received commentary -- check dynamoDb!\"";

        return {
            statusCode: status,
            body: responseBody
        };

    } catch (err) {
        console.log(err);
        return {
            statusCode: 500,
            body: JSON.stringify({
                message: err.stack,
            }),
        };
    }
};

const provideCommentary = async (commentary: Commentary) => {
  // Set the parameters.
  const params = {
    TableName: "commentary-dev",
    Item: {
      id: commentary.getId(),
      content: commentary.getContent(),
      createdAt : commentary.getCreatedAt(),
      providerId: commentary.getProviderId(),
      receiverId: commentary.getReceiverId()
    },
  };
  try {
    const data = await ddbDocClient.send(new PutCommand(params));
    console.log("Success - item added or updated", data);
  } catch (err) {
    console.log("Error", err.stack);
    throw err;
  }
};

Where the Commentary class in domain.ts is:

class Commentary {
  private id: number;
  private content: string;
  private createdAt: Date;
  private providerId: number;
  private receiverId: number;

  constructor(id: number, content: string, createdAt: Date, providerId: number, receiverId: number) {
    this.id = id;
    this.content = content;
    this.createdAt = createdAt;
    this.providerId = providerId;
    this.receiverId = receiverId;
  }

  public getId(): number {
    return this.id;
  }

  public getContent(): string {
    return this.content;
  }

  public getProviderId(): number {
    return this.providerId;
  }

  public getReceiverId(): number {
    return this.receiverId;
  }

}

export { Commentary };

When I invoke my Lambda, via command-line curl:

curl --request POST 'https://<mylambda>/commentary' \
--header 'Content-Type: application/json' -d '{"id":123,"content":"test commentary","createdAt":"2022-12-02T08:45:26.261-05:00","providerId":456,"receiverId":789}'

...I see the following error in my terminal:

{"message":"TypeError: r.getContent is not a function\n

Any idea why event.body is having trobule being deserialized into a Commentary?

CodePudding user response:

You haven't properly constructed a Commentary instance. Instead, you have just set the commentary variable's value to the parsed body, a plain-old object.

const { id, content, createdAt, providerId, receiverId } = JSON.parse(event.body);

const commentary = new Commentary(id, content, createdAt, providerId, receiverId);
  • Related