Класс промежуточного слоя в Nest
Функции хватает для простой записи в ответ, но иногда слою нужны поля и зависимости, как у сервиса. Тогда логику оформляют классом, который Nest умеет создавать сам.
Класс помечают @Injectable
и реализуют контракт промежуточного
слоя с методом use. Параметры
те же, что у функции: запрос и ответ
из Express и колбэк передачи.
Класс регистрируют в провайдерах
модуля и передают в цепочку через
apply.
Покажем на примере постов:
import { Injectable, NestMiddleware } from '@nestjs/common';
import { NextFunction, Request, Response } from 'express';
@Injectable()
export class PostLoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
res.setHeader('X-Post-Logger', '1');
next();
}
}
Контроллер списка:
import { Controller, Get } from '@nestjs/common';
@Controller('posts')
export class PostController {
@Get()
getPosts(): string {
return 'All posts';
}
}
Модуль держит контроллер, провайдер слоя и настройку цепочки:
import {
MiddlewareConsumer,
Module,
NestModule,
} from '@nestjs/common';
import { PostController } from './post.controller.js';
import { PostLoggerMiddleware } from './post.logger.middleware.js';
@Module({
controllers: [PostController],
providers: [PostLoggerMiddleware],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(PostLoggerMiddleware)
.forRoutes('posts');
}
}
Опишите слой классом
для адресов работников,
запишите его в провайдеры
WorkersModule и подключите
к WorkerController. Заголовок
в ответе должен быть виден до
тела страницы.