Skip to content

Middleware ​

Middleware consists of functions executed before the route handler. They can perform a wide range of tasks, such as logging, authentication, and request parsing.

Use Cases ​

Middleware is versatile and can be used for a variety of cross-cutting concerns, including:

  • Logging: Recording details about incoming requests and outgoing responses.
  • Authentication/Authorization: Validating credentials or permissions before allowing access to a route.
  • Request Parsing: Parsing request bodies (e.g., JSON, form-data).
  • Security: Adding security headers (e.g., CORS, CSRF protection).
  • Caching: Implementing caching strategies to improve performance.
  • Rate Limiting: Protecting your API from abuse.

Creating Middleware ​

A middleware is a class that implements the IMiddleware interface, which has a single use method. This method receives the Hono Context and a next function.

Example: A simple logger middleware.

typescript
import type { IMiddleware } from 'honestjs'
import type { Context, Next } from 'hono'

export class LoggerMiddleware implements IMiddleware {
	async use(c: Context, next: Next) {
		console.log(`[${c.req.method}] ${c.req.url} - Request received`)
		await next()
		console.log(`Response status: ${c.res.status}`)
	}
}

Applying Middleware ​

Middleware can be applied using the @UseMiddleware() decorator or by configuring it globally when creating the application.

Global Middleware ​

Global middleware is applied to every route in your application. It is useful for cross-cutting concerns like logging, security headers, or request ID generation.

Global middleware can be registered in the Application.create options.

Example:

typescript
import { Application } from 'honestjs'
import { LoggerMiddleware } from './middleware/logger.middleware'

const { hono } = await Application.create(AppModule, {
	components: {
		middleware: [new LoggerMiddleware()]
	}
})

Controller-Level Middleware ​

Middleware can be applied to all routes within a specific controller by using the @UseMiddleware() decorator on the controller class.

Example:

typescript
import { Controller } from 'honestjs'
import { UseMiddleware } from 'honestjs'
import { AuthenticationMiddleware } from './middleware/auth.middleware'

@Controller('/profile')
@UseMiddleware(AuthenticationMiddleware)
export class ProfileController {
	// All routes in this controller will be protected by the AuthenticationMiddleware.
}

Handler-Level Middleware ​

Middleware can also be applied to a specific route handler. This is useful when a middleware is only needed for one or a few routes.

Example:

typescript
import { Controller, Get, UseMiddleware } from 'honestjs'
import { SpecificTaskMiddleware } from './middleware/specific-task.middleware'

@Controller('/tasks')
export class TasksController {
	@Get('/:id')
	@UseMiddleware(SpecificTaskMiddleware)
	getTask() {
		// This route is the only one that uses the SpecificTaskMiddleware.
	}
}

Execution Order ​

Middleware is executed in the following order:

  1. Global Middleware
  2. Controller-Level Middleware
  3. Handler-Level Middleware

If multiple middleware are applied at the same level (e.g., @UseMiddleware(MiddlewareA, MiddlewareB)), they are executed in the order they are listed.

Using Hono Middleware ​

HonestJS is built on Hono, so you can use any existing Hono middleware. The mvc example shows how to integrate Hono's jsxRenderer middleware.

To use a Hono middleware, create a simple wrapper class.

typescript
// A wrapper to use Hono's jsxRenderer with HonestJS.
import { jsxRenderer } from 'hono/jsx-renderer'
import type { IMiddleware } from 'honestjs'
import type { Context, Next } from 'hono'

export class HonoMiddleware implements IMiddleware {
	constructor(private middleware: any) {}

	use(c: Context, next: Next) {
		return this.middleware(c, next)
	}
}
typescript
// In main.ts
const { hono } = await Application.create(AppModule, {
	components: {
		middleware: [new HonoMiddleware(jsxRenderer(MainLayout))]
	}
})

This approach allows you to seamlessly integrate the rich ecosystem of Hono middleware into your HonestJS application.

Released under the MIT License.