Адаптер Fastify
@inferdi/fastify - это плагин для Fastify v5. В режиме со scope он выставляет root как app.di, создаёт scope запроса в onRequest, выставляет его как request.di и очищает в onResponse.
Установка
bash
pnpm add @inferdi/inferdi @inferdi/fastify fastifyts
import Fastify, { type FastifyRequest } from 'fastify'
import { inferdiFastify } from '@inferdi/fastify'Scope запроса
Опубликуйте конкретные типы контейнеров через расширение модуля:
ts
const root = buildRootContainer()
const app = Fastify()
type RootContainer = typeof root
type RequestContainer = ReturnType<RootContainer['createScope']>
declare module 'fastify' {
interface FastifyInstance {
di: RootContainer
}
interface FastifyRequest {
di: RequestContainer
}
}
await app.register(inferdiFastify, {
container: root,
setupScope: (scope: RequestContainer, request) => {
const ctx = scope.get('request')
ctx.requestId = request.id
ctx.ip = request.ip
},
})
app.get('/users/:id', async (request) => {
const { id } = request.params as { id: string }
return request.di.get('users').profile(id)
})Fastify app.register не может глубоко вывести generics плагина для inline hooks, поэтому параметры hook лучше аннотировать явно.
Опции
| Опция | По умолчанию | Назначение |
|---|---|---|
container | обязательна | Корневой контейнер, выставленный как app.di. |
scopePerRequest | true | false для режима без scope запроса. |
createScope | root.createScope() | Пользовательское создание scope запроса. |
setupScope | нет | Наполняет scope в onRequest. |
disposeScope | scope.dispose() | Пользовательская очистка. |
autoDispose | true | false или предикат false передаёт владение. |
disposeRootOnClose | false | Очищает root во время fastify.close(). |
onDisposeError | request.log.error | Приёмник ошибок очистки scope запроса. |
Режим без scope запроса
ts
await app.register(inferdiFastify, {
container: root,
scopePerRequest: false,
})
app.get('/health', async function () {
return this.di.get('health').check()
})В этом режиме адаптер не устанавливает request decoration и hooks жизненного цикла запроса.
Заметки о жизненном цикле
request.diвыставляется только после успешного setup.- Ошибка setup очищает полусобранный scope и поднимает только исходную ошибку setup.
- Cleanup hooks видят
request.di, пока выполняются. - Упавший запрос игнорирует
skipInferdiDisposeи всё равно очищает scope, с учётомautoDispose. - Очистка при client abort выполняется в
onRequestAbortпосле выставления scope. - Ошибки очистки root проходят через
fastify.close()только сdisposeRootOnClose.
