A very common reason is a wrong site baseUrl configuration.\n

Current configured baseUrl = / (default value)\n

We suggest trying baseUrl = \n\n',document.body.prepend(n);var e=document.getElementById("__docusaurus-base-url-issue-banner-suggestion-container"),s=window.location.pathname,o="/"===s.substr(-1)?s:s+"/";e.innerHTML=o}document.addEventListener("DOMContentLoaded",(function(){void 0===window.docusaurus&&insertBanner()}))

Skip to main content

The stylish Node.js middleware engine for AWS Lambda

Organise your Lambda code, remove code duplication, focus on business logic!

Simple but powerful

A middleware engine makes your code more organised, removes duplication and uniforms the handling of non-functional concerns like authentication, authorization, validation, and serialization.

Focus on what matters

By pushing all the non-functional code to middlewares, you can be productive and focus on what matters the most: the business logic!

Small core

Middy comes with a very small core and an unobtrusive API to add the minimum amount of overhead to your code.

Batteries included

Middy comes with a large set of official middlewares and utilities that can be used out of the box to address the most common non-functional use cases.

Blazing fast

Middy has been engineered to keep your lambda as fast as possible. The minimal core keeps your lambda size small and your cold starts under control. Add only what you need!

Extensible

Do you need to do more? It's really easy to write your own custom middlewares. And, if that's not enough, you can even extend middy itself through its hooks.

Show me the code!

The following abstract example illustrates the difference of style when using Middy:

Without Middy

handler.js
export const handler = (event, context) => {
// BOILERPLATE!
// E.g. decrypt environment variables with KMS
// deserialize the content of the event
// validate input, authentication, authorization

// REAL BUSINESS LOGIC
let response = doSomethingUsefulWith(event)

// MORE BOILERPLATE
// E.g.
// validate output
// serialize response
// handle errors
return response
}

Without Middy all your non-functional code is mixed up with the actual business logic in your handler.

The code is hard to understand and maintain. What if you need to reuse some of the non-functional logic in another handler?

With Middy

handler.js
import middy from '@middy/core'

const lambdaHandler = (event, context) => {
// REAL BUSINESS LOGIC
return doSomethingUsefulWith(event)
}

export const handler = middy(lambdaHandler)
.use(/* Your own behaviour in a reusable fashion */)
.use(/* logging and tracing */)
.use(/* input validation */)
.use(/* authentication */)
.use(/* error handling */)
.use(/* other behaviour */)

Middy helps you to keep all the non-functional code outside from your handler function.

The business logic in your handler remains pure and testable. All the non functional logic is isolated and reusable.

Do you want to see some more realistic examples?

API Gateway (HTTP) API Gateway (REST) API Gateway (WebSockets) Function URL S3 Object Response SQS

Ready to get started?