The Server class is responsible for managing the HTTP server lifecycle in AdonisJS. It handles starting and stopping the server, managing middleware, and processing incoming requests.
Importing
import server from '#services/server'
import { Server } from '@adonisjs/core/http'
Properties
Reference to the application’s router instance
Hooks manager for registering lifecycle hooks
Middleware store for managing global and route middleware
Methods
use()
Register global middleware to be executed for all requests.
server.use([
() => import('#middleware/container_bindings_middleware'),
() => import('#middleware/force_json_response_middleware'),
() => import('@adonisjs/core/bodyparser_middleware')
])
Array of middleware functions or lazy imports
Returns: this
useRouted()
Register routed middleware that can be selectively applied to routes.
server.useRouted({
auth: () => import('#middleware/auth_middleware'),
guest: () => import('#middleware/guest_middleware')
})
middleware
Record<string, MiddlewareFunction>
Object mapping middleware names to their implementations
Returns: this
errorHandler()
Register a custom error handler for the application.
server.errorHandler(() => import('#exceptions/handler'))
handler
() => Promise<ErrorHandler>
Lazy import function that returns an error handler class
Returns: this
start()
Start the HTTP server and begin listening for requests.
await server.start((handle) => {
const server = createServer(handle)
server.listen(3333)
return server
})
callback
(handle: HandleFunction) => NodeServer | Promise<NodeServer>
Callback function that receives the request handler and returns a Node.js server instance
Returns: Promise<void>
close()
Gracefully close the HTTP server.
Returns: Promise<void>
optimize()
Optimize the server by precompiling routes and middleware.
Returns: Promise<void>
handle()
Handle an incoming HTTP request. This method is typically called internally.
const ctx = await server.handle(req, res)
Node.js incoming message object
Node.js server response object
Returns: Promise<HttpContext>
Hooks
The server exposes several lifecycle hooks for executing code at specific points:
before
Executed before the middleware pipeline starts.
server.hooks.before(async (ctx) => {
console.log(`Request to ${ctx.request.url()}`)
})
after
Executed after the response has been sent.
server.hooks.after(async (ctx) => {
console.log(`Response sent with status ${ctx.response.getStatus()}`)
})
Example Usage
import server from '#services/server'
// Register global middleware
server.use([
() => import('#middleware/container_bindings_middleware'),
() => import('@adonisjs/core/bodyparser_middleware')
])
// Register named middleware
server.useRouted({
auth: () => import('#middleware/auth_middleware')
})
// Set error handler
server.errorHandler(() => import('#exceptions/handler'))
// Register lifecycle hooks
server.hooks.before(async (ctx) => {
ctx.request.startTime = Date.now()
})
server.hooks.after(async (ctx) => {
const duration = Date.now() - ctx.request.startTime
console.log(`Request completed in ${duration}ms`)
})
Type Safety
The server is fully typed and integrates with TypeScript for type-safe middleware and error handlers:
import type { HttpServerService } from '@adonisjs/core/types'
// Access server through container
const server: HttpServerService = await app.container.make('server')