Serverless-stack-com: Comments: Add a Get Note API

Created on 10 Apr 2017  Â·  29Comments  Â·  Source: AnomalyInnovations/serverless-stack-com

Most helpful comment

@idowolf The get function uses the id from the note you created in the Create chapter. So make sure to replace this https://github.com/AnomalyInnovations/serverless-stack-demo-api/blob/add-a-get-note-api/mocks/get-event.json#L3 with the one you get when you run the create command.

All 29 comments

Getting this when running the mock noteId parameter (serverless webpack invoke --function get --path event.json)

Type Error ---------------------------------------------

 Cannot read property 'handler' of undefined

@willybeans can you check your serverless.yml and look for the handler property?

@jayair here is the bottom part of the file:

  get:
    # Defines an HTTP API endpoint that calls the main function in get.js
    # - path: url path is /notes/{id}
    # - method: GET request
    handler: get.main
    events:
      - http:
          path: notes/{id}
          method: get
          cors: true
          authorizer:
            arn: arn:aws:cognito-idp:us-east-2:433151866650:userpool/us-east-2_mttWckAZq 

@willybeans this error means the get handler was not found in serverless.yml. Could you share the rest of your serverless.yml file?

@fwang

service: notes-app-api

plugins:
  - serverless-webpack

custom:
  webpackIncludeModules: true

provider:
  name: aws
  runtime: nodejs6.10
  stage: prod
  region: us-east-2

  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:DescribeTable
        - dynamodb:Query
        - dynamodb:Scan
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:UpdateItem
        - dynamodb:DeleteItem
      Resource: "arn:aws:dynamodb:us-east-1:*:*"

  get:
    # Defines an HTTP API endpoint that calls the main function in get.js
    # - path: url path is /notes/{id}
    # - method: GET request
    handler: get.main
    events:
      - http:
          path: notes/{id}
          method: get
          cors: true
          authorizer:
            arn: arn:aws:cognito-idp:us-east-2:433151866650:userpool/us-east-2_mttWckAZq

@willybeans just noticed that you are missing the functions block. Have a look at the serverless.yml from this chapter - https://github.com/AnomalyInnovations/serverless-stack-demo-api/blob/add-a-get-note-api/serverless.yml#L29.

Notice, the get block is inside the functions block.

I had to mark the main function as 'async' to avoid the error
SyntaxError: await is a reserved word

I seem to have missed that, maybe while moving through the chapters. thanks :)

When I run the command

serverless webpack invoke --function get --path mocks/get-event.json
I'm getting

Serverless: Bundling with Webpack...
Time: 617ms
     Asset     Size  Chunks             Chunk Names
 create.js   5.8 kB       0  [emitted]  create
    get.js  5.88 kB       1  [emitted]  get
handler.js  2.28 kB       2  [emitted]  handler
Serverless: Run function get...
{ statusCode: 500,
  headers: 
   { 'Access-Control-Allow-Origin': '*',
     'Access-Control-Allow-Credentials': true },
  body: '{"status":false,"error":"Item not found."}' }

But when I ran the "create" command before it went well with statusCode 200.
What could have gone wrong?

@idowolf The get function uses the id from the note you created in the Create chapter. So make sure to replace this https://github.com/AnomalyInnovations/serverless-stack-demo-api/blob/add-a-get-note-api/mocks/get-event.json#L3 with the one you get when you run the create command.

How come item not found will be status code 500. i think there has to be another way to respond with proper status codes like 400, 404

@yashg5 Yeah we leave that to you. It's pretty straightforward, the status codes are being set here - https://github.com/AnomalyInnovations/serverless-stack-demo-api/blob/master/libs/response-lib.js#L6

When running...

serverless invoke local --function get --path mocks/get-event.json

I get the following type error "lambda is not a function". Any thoughts on what is causing this problem?

@sdooley-ebsco It might be because get is probably not pointing to a function? It's most likely a typo in your serverless.yml.

In "get.js", these are the first two lines:
import * as dynamoDbLib from "./libs/dynamodb-lib";
import { success, failure } from "./libs/response-lib";

I thought I had installed my AWS CLI and other tools correctly, but when I run my /mocks/get-event.json, I get the following error:

ERROR in ./get.js
Module not found: Error: Can't resolve './libs/dynamodb-lib' in '/notes-app-api'
@ ./get.js 68:19-49

ERROR in ./get.js
Module not found: Error: Can't resolve './libs/response-lib' in '/notes-app-api'
@ ./get.js 72:19-49

Where should it be finding /libs/response-lib and /libs/dynamodb-lib on my macOS, so that I can update the paths in get.js accordingly?

Thank you

@omairhamid We create both of these in the previous chapter here - https://serverless-stack.com/chapters/add-a-create-note-api.html#refactor-our-code

@jayair Thank you. I have no idea how I missed that. Happy new year!

When running…

serverless invoke local --function get --path mocks/get-event.json

I get the error…

 Unexpected token u in JSON at position 0

Which appears related to this SO question. Adding…

"body": "{\"text\":\"\"}"

…to get-event.json fixed it.

@starkos That shouldn't be the case for a GET request. Can you check your serverless.yml and ensure that method: get is set for this function?

Confirmed:

  get:
    handler: get.main
    events:
      - http:
          path: notes/{id}
          method: get
          cors: true
          authorizer: aws_iam

@starkos I see. This is weird. Which version of Serverless are you using?

1.25.0

@starkos Can you try it with the repo in the tutorial and see if you get the same thing? https://github.com/AnomalyInnovations/serverless-stack-demo-api/tree/add-a-get-note-api

I faced a ResourceNotFoundException for a while trying to execute the code for this chapter.
Turned out, I needed to configure the AWS region again in get.js, despite issuing a create call earlier that was already doing this.

Can someone explain why this may be needed?

@karthickng Do you have multiple AWS credentials?

I had to do the same thing as karthickng and I do not have multiple AWS credentials.

@smittym @karthickng We moved the AWS.config.update({ region: "us-east-1" }); line inside src/libs/dynamodb-lib.js in the previous chapter. So just make sure it is in there for this chapter as well.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

AcidLeroy picture AcidLeroy  Â·  12Comments

jayair picture jayair  Â·  3Comments

jayair picture jayair  Â·  4Comments

Abdizriel picture Abdizriel  Â·  13Comments

jayair picture jayair  Â·  11Comments