This module will help you build a valid API Gateway response from your lambda function.
npm i @kdcio/api-gw-respimport response from '@kdcio/api-gw-resp'; export const listMovies = (event) => { const body = { movies: [ { name: 'Lord of the Rings' }, { name: 'Forest Gump' }, { name: 'Breaveheart' }, ], }; return response.OK({ body }); };The function above will return
{ "statusCode": 200, "isBase64Encoded": false, "headers": { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Credentials": true, "Access-Control-Allow-Headers": "*" }, "body": "{\"movies\":[{\"name\":\"Lord of the Rings\"},{\"name\":\"Forest Gump\"},{\"name\":\"Breaveheart\"}]}" }| Method | Code | Description |
|---|---|---|
| OK | 200 | Request has succeeded and the message body contains the requested information. |
| CREATED | 201 | Request has succeeded and a new resource has been created. The message body may contain information about the new resource. |
| NO_CONTENT | 204 | Request has succeeded but there is no content to be returned. |
Options
| Option | Type | Required | Default | Description |
|---|---|---|---|---|
| body | object, string or null | ☑️ | null |
|
| cors | bool | ☑️ | true | If true, will add cors in header |
| origin | string | ☑️ | * | Set specific origin |
| headers | object | ☑️ | {} | Specify additional headers |
Examples:
response.OK({ body: { name: 'John Doe' } }); response.CREATED({ body: { id: 1 } }); response.NO_CONTENT();| Method | Code | Description |
|---|---|---|
| REDIRECT | 301 or 302 | The URI of the requested resource has moved. The new URI can be found in the Location header. |
Options
| Option | Type | Required | Default | Description |
|---|---|---|---|---|
| permanent | bool | ☑️ | none | If true, status code will be 301. Otherwise it will be 302. |
| location | bool | ☑️ | none | The new url where the resource has been moved. |
| headers | object | ☑️ | {} | Specify additional headers |
Examples:
response.REDIRECT({ permanent: true, location: 'https://www.google.com', });| Method | Code | Description |
|---|---|---|
| BAD_REQUEST | 400 | The server could not understand the request due to invalid syntax or missing parameters. |
| UNAUTHORIZED | 401 | The client must authenticate itself to get the requested response. |
| FORBIDDEN | 403 | The client is not allowed to access the requested resource. Unlike 401, the client's identity is known to the server. |
| NOT_FOUND | 404 | The server can not find the requested resource. |
| CONFLICT | 409 | This response is sent when a request conflicts with the current state of the server. Usually duplicate of data. |
Options
| Option | Type | Required | Default | Description |
|---|---|---|---|---|
| error | string | ☑️ | Status code name | Error name |
| message | string | ✅ | none | Error message |
Examples:
response.BAD_REQUEST({ message: 'Missing username' }); response.UNAUTHORIZED({ message: 'You need to login to access this resource.', }); response.FORBIDDEN({ message: 'You are not allowed to access this resource.' }); response.NOT_FOUND({ message: 'Resource not found.' }); response.CONFLICT({ message: 'Duplicate username.' });| Method | Code | Description |
|---|---|---|
| SERVER_ERROR | 500 | The server has encountered a situation it doesn't know how to handle. |
Options
| Option | Type | Required | Default | Description |
|---|---|---|---|---|
| error | string | ☑️ | Internal Server Error | Error name |
| message | string | ✅ | none | Error message |
Examples:
response.SERVER_ERROR({ message: 'Internal server error.' });| Method | Description |
|---|---|
| ERROR | This will auto detect which error code to send based on the message. |
Options
| Option | Type | Required | Default | Description |
|---|---|---|---|---|
| message | string | ✅ | none | Error message |
Error Messages
| Error Response | Regex matcher |
|---|---|
| BAD_REQUEST | /missing|invalid/i |
| UNAUTHORIZED | /unauthorized/i |
| FORBIDDEN | /forbidden|not allowed/i |
| NOT_FOUND | /not found/i |
| CONFLICT | /conflict|duplicate/i |
Examples:
try { throw new Error('Missing username'); } catch (e) { // This will return status code 400 (BAD_REQUEST) return response.ERROR({ message: e.message }); }import parser from '@kdcio/api-gw-req'; import response from '@kdcio/api-gw-resp'; import db from './db'; export const movie = async (event) => { const request = parser(event); let body = null; if (event.method === 'GET') { try { const movies = db.listMovies(); return response.OK({ body: { movies } }); } catch (e) { return response.BAD_REQUEST({ message: e.message }); } } else if (event.method === 'POST') { try { const id = await db.insertMove(request.body); return response.OK({ body: { id } }); } catch (e) { return response.BAD_REQUEST({ message: e.message }); } } else if (event.method === 'PUT') { try { await db.updateMove(request.body); return response.NO_CONTENT(); } catch (e) { return response.CONFLICT({ message: e.message }); } } return response.BAD_REQUEST({ message: 'Invalid method', }); };Using ERROR method:
import parser from '@kdcio/api-gw-req'; import response from '@kdcio/api-gw-resp'; import db from './db'; export const movie = async (event) => { const request = parser(event); let body = null; try { if (event.method === 'GET') { const movies = db.listMovies(); return response.OK({ body: { movies } }); } else if (event.method === 'POST') { const id = await db.insertMove(request.body); return response.OK({ body: { id } }); } else if (event.method === 'PUT') { await db.updateMove(request.body); return response.NO_CONTENT(); } else { throw new Error('Invalid method'); } } catch (e) { // Will determine the correct status code based on the error message return response.ERROR({ message: e.message }); } };If you find this project useful, please consider giving a star. I would really appreciate it.
You can also:
