Nota: este artículo solo registra el conocimiento y la comprensión del blogger después de aprender nestjs por primera vez. La experiencia aún es superficial y el contenido del artículo es solo de referencia. Corríjame si hay algún error.
Como aspecto
Este artículo no discutirá los detalles temporalmente.
1. Tipo de aspecto: clase de implementación de la interfaz NestMiddleware
2. Entrada de aspecto
- Objeto de solicitud
- Objeto de respuesta
- siguiente función
3. Salida de sección: luego ingrese a la siguiente sección
4. Usa la escena
- Ejecute cualquier código.
- Realice cambios en los objetos de solicitud y respuesta.
- Finalice el ciclo de solicitud-respuesta.
- Llame a la siguiente función de middleware de la pila.
- Si la función de middleware actual no finaliza el ciclo de solicitud-respuesta, debe llamar a next () para pasar el control a la siguiente función de middleware. De lo contrario, se suspenderá la solicitud.
Caso simple
1. Definición de middleware
- Método 1: middleware de clase
import {
Injectable, NestMiddleware } from '@nestjs/common';
import {
Request, Response } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
// 中间件定义:必须是NestMiddleware接口的实现类并且实现use方法,参数为请求、响应、转发到下一个中间件的方法
use(req: Request, res: Response, next: Function) {
console.log('Request...');
next();
}
}
- Método 2: middleware funcional
export function logger(req, res, next) {
console.log(`Request...`);
next();
}
2. Registro de middleware
- Registro del módulo (app.module.ts)
import {
Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import {
LoggerMiddleware } from './common/middleware/logger.middleware';
import {
CatsModule } from './cats/cats.module';
import {
CatsController } from './cats/cats.controller.ts';
@Module({
imports: [CatsModule],
})
export class AppModule implements NestModule {
// 中间件注册:不在@module中配置,而是在NestModule接口的configure方法中注册一个中间件消费者(MiddlewareConsumer)实例,在该实例中配置该中间件消费者的消费特征(应用哪个中间件、处理哪些请求、排除哪些请求)。
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)// 可配置多个中间件
.exclude(
{
path: 'cats', method: RequestMethod.GET },
{
path: 'cats', method: RequestMethod.POST },
'cats/(.*)',
)
// forRoutes配置经过中间件的请求有哪些,可接受一个字符串、多个字符串、对象、一个控制器类甚至多个控制器类,传对象时path属性支持通配符*。
.forRoutes(CatsController);
}
}
- Registro global (main.ts)
const app = await NestFactory.create(AppModule);
app.use(logger);
await app.listen(3000);