Hapi
Quick Start
const server = Hapi.server({ port: 3000 });
server.route({ method: 'GET', path: '/', handler: () => 'ok' });
await server.start();
Critical Rules
- Compose with decorations & methods - Expose services via decorations and reusable logic via methods
- Follow the lifecycle - 24-step request flow; see lifecycle overview
- Auth is three layers - scheme → strategy → default; see server auth
- Validate at the route - Use joi schemas on params, query, payload, headers; see validation
- Type routes with Refs - Use
ServerRoute<Refs> with ONLY the keys you need (Params, Query, Payload, etc.); omitted keys keep defaults. See route scaffold
Auth three-layer pattern:
server.auth.scheme('custom', schemeImpl); // 1. scheme (how to authenticate)
server.auth.strategy('session', 'custom', options); // 2. strategy (configured instance)
server.auth.default('session'); // 3. default (apply to all routes)
Scheme authenticate MUST return h.authenticated() with both credentials AND artifacts:
return h.authenticated({
credentials: { user: { id, name }, scope: ['user'] },
artifacts: { token } // always include artifacts for raw auth data
});
Route validation pattern:
server.route({
method: 'POST',
path: '/users',
options: {
validate: {
payload: Joi.object({
name: Joi.string().required(),
email: Joi.string().email().required()
})
}
},
handler: (request) => request.payload
});
Workflow
- Create server - server overview for constructor options
- Register plugins - plugins and plugin structure
- Configure auth - auth schemes and route auth
- Verify auth - Test with
server.inject() before defining protected routes; see network
- Define routes - route overview with handlers
- Add extensions - lifecycle hooks and pre-handlers
Key Patterns
| Topic |
Reference |
| Request/response objects |
request, response |
| Response toolkit (h) |
toolkit |
| Sessions (yar) |
sessions |
| Caching & CORS |
cache-cors, server cache, catbox-memory engine, catbox-fs engine, catbox-redis engine |
| Security headers |
security |
| Payload parsing |
payload |
| Decorations & methods |
decorations, methods |
| MIME types (mimos) |
mimos |
| Realms & plugin scoping |
realm |
| Response marshalling |
marshal pipeline |
| File serving (inert) |
overview, file handler, directory handler |
| Basic authentication |
basic auth |
| Error handling (Boom) |
boom errors |
| Error filtering (Bounce) |
bounce utility |
| WebSockets (nes) |
overview, subscriptions, client |
| SSE (sse) |
overview, api, subscriptions, session, replay |
| Startup & shutdown |
startup lifecycle |
| Events |
events |
| Testing (server.inject) |
network |
| TypeScript overview |
typescript |
| TypeScript auth typing |
auth-scheme, type-author |
| JWT authentication |
jwt overview, validate function, token API |
| TypeScript plugins |
plugin-scaffold |
| Views & templates |
vision overview, engines, context & layouts |
1---2name: hapi3description: Creates, configures, and debugs `@hapi/hapi` servers — implements routes, plugins, auth schemes, validation, caching, and request lifecycle hooks. Use when building HTTP APIs, setting up stale-while-revalidate caching, registering server methods, configuring views, managing startup sequences, or troubleshooting response marshalling.4---56# Hapi789## Quick Start1011 const server = Hapi.server({ port: 3000 });12 server.route({ method: 'GET', path: '/', handler: () => 'ok' });13 await server.start();141516## Critical Rules17181. **Compose with decorations & methods** - Expose services via [decorations](reference/server/decorations.md) and reusable logic via [methods](reference/server/methods.md)192. **Follow the lifecycle** - 24-step request flow; see [lifecycle overview](reference/lifecycle/overview.md)203. **Auth is three layers** - scheme → strategy → default; see [server auth](reference/server/auth.md)214. **Validate at the route** - Use joi schemas on params, query, payload, headers; see [validation](reference/route/validation.md)225. **Type routes with Refs** - Use `ServerRoute<Refs>` with ONLY the keys you need (Params, Query, Payload, etc.); omitted keys keep defaults. See [route scaffold](reference/typescript/route-scaffold.md)2324Auth three-layer pattern:2526 server.auth.scheme('custom', schemeImpl); // 1. scheme (how to authenticate)27 server.auth.strategy('session', 'custom', options); // 2. strategy (configured instance)28 server.auth.default('session'); // 3. default (apply to all routes)2930Scheme authenticate MUST return `h.authenticated()` with both credentials AND artifacts:3132 return h.authenticated({33 credentials: { user: { id, name }, scope: ['user'] },34 artifacts: { token } // always include artifacts for raw auth data35 });3637Route validation pattern:3839 server.route({40 method: 'POST',41 path: '/users',42 options: {43 validate: {44 payload: Joi.object({45 name: Joi.string().required(),46 email: Joi.string().email().required()47 })48 }49 },50 handler: (request) => request.payload51 });525354## Workflow55561. **Create server** - [server overview](reference/server/overview.md) for constructor options572. **Register plugins** - [plugins](reference/server/plugins.md) and [plugin structure](reference/plugins/overview.md)583. **Configure auth** - [auth schemes](reference/server/auth.md) and [route auth](reference/route/auth.md)594. **Verify auth** - Test with `server.inject()` before defining protected routes; see [network](reference/server/network.md)605. **Define routes** - [route overview](reference/route/overview.md) with [handlers](reference/route/handler.md)616. **Add extensions** - [lifecycle hooks](reference/server/extensions.md) and [pre-handlers](reference/route/pre.md)626364## Key Patterns6566| Topic | Reference |67| ------------------------ | ------------------------------------------------------------------------------------------------------ |68| Request/response objects | [request](reference/lifecycle/request-object.md), [response](reference/lifecycle/response-object.md) |69| Response toolkit (h) | [toolkit](reference/lifecycle/response-toolkit.md) |70| Sessions (yar) | [sessions](reference/server/sessions.md) |71| Caching & CORS | [cache-cors](reference/route/cache-cors.md), [server cache](reference/server/cache.md), [catbox-memory engine](reference/server/catbox-memory.md), [catbox-fs engine](reference/server/catbox-fs.md), [catbox-redis engine](reference/server/catbox-redis.md) |72| Security headers | [security](reference/route/security.md) |73| Payload parsing | [payload](reference/route/payload.md) |74| Decorations & methods | [decorations](reference/server/decorations.md), [methods](reference/server/methods.md) |75| MIME types (mimos) | [mimos](reference/server/mimos.md) |76| Realms & plugin scoping | [realm](reference/server/realm.md) |77| Response marshalling | [marshal pipeline](reference/lifecycle/response-marshal.md) |78| File serving (inert) | [overview](reference/file-serving/overview.md), [file handler](reference/file-serving/file-handler.md), [directory handler](reference/file-serving/directory-handler.md) |79| Basic authentication | [basic auth](reference/auth/basic.md) |80| Error handling (Boom) | [boom errors](reference/lifecycle/boom.md) |81| Error filtering (Bounce) | [bounce utility](reference/lifecycle/bounce.md) |82| WebSockets (nes) | [overview](reference/websockets/overview.md), [subscriptions](reference/websockets/subscriptions.md), [client](reference/websockets/client.md) |83| SSE (sse) | [overview](reference/sse/overview.md), [api](reference/sse/api.md), [subscriptions](reference/sse/subscriptions.md), [session](reference/sse/session.md), [replay](reference/sse/replay.md) |84| Startup & shutdown | [startup lifecycle](reference/server/startup-lifecycle.md) |85| Events | [events](reference/server/events.md) |86| Testing (server.inject) | [network](reference/server/network.md) |87| TypeScript overview | [typescript](reference/typescript.md) |88| TypeScript auth typing | [auth-scheme](reference/typescript/auth-scheme.md), [type-author](reference/typescript/type-author.md) |89| JWT authentication | [jwt overview](reference/jwt-auth/overview.md), [validate function](reference/jwt-auth/validate.md), [token API](reference/jwt-auth/token-api.md) |90| TypeScript plugins | [plugin-scaffold](reference/typescript/plugin-scaffold.md) |91| Views & templates | [vision overview](reference/views/overview.md), [engines](reference/views/engines.md), [context & layouts](reference/views/context.md) |