中间件与管道

class 中间件,管道

在Nest.js中,中间件和管道是处理请求和响应的重要组成部分。它们可以用于处理请求数据、进行验证、修改请求/响应对象等。

1. 中间件

中间件是在请求处理流程中的函数,可以用于执行一些操作,比如请求验证、日志记录、请求修改等。中间件可以在路由处理之前或之后执行。

创建和使用中间件
  • 定义中间件
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    console.log(`Request... ${req.method} ${req.url}`);
    next(); // 调用next()以继续请求处理
  }
}
  • 注册中间件

在模块中注册中间件,可以在特定的路由上使用,也可以全局使用。

import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
import { LoggerMiddleware } from './logger.middleware';

@Module({
  controllers: [UsersController],
  providers: [UsersService],
})
export class UsersModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMiddleware)
      .forRoutes(UsersController); // 应用于UsersController的所有路由
  }
}
中间件的常用属性和方法
  • use(req: Request, res: Response, next: NextFunction):这是中间件的核心方法,用于处理请求。在这里,可以访问请求和响应对象,执行所需的操作,并通过调用next()继续处理。

2. 管道

管道用于数据验证和转换。在请求到达处理函数之前,管道可以验证、转换请求的数据,确保数据符合预期格式。

创建和使用管道
  • 定义管道
import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';

@Injectable()
export class ValidationPipe implements PipeTransform {
  transform(value: any, metadata: ArgumentMetadata) {
    if (!value.name) {
      throw new BadRequestException('Name is required');
    }
    return value; // 返回处理后的数据
  }
}
  • 应用管道

管道可以在控制器或路由处理函数上使用。

import { Controller, Post, Body, UsePipes } from '@nestjs/common';
import { UsersService } from './users.service';
import { ValidationPipe } from './validation.pipe';

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Post()
  @UsePipes(new ValidationPipe())
  create(@Body() user: any) {
    return this.usersService.create(user);
  }
}
管道的常用属性和方法
  • transform(value: any, metadata: ArgumentMetadata):用于转换和验证传入的数据。value是请求体中的数据,metadata包含了关于参数的元信息,如类型等。
  • @UsePipes():用于在控制器或路由处理函数上应用管道。

整体的使用示例

以下是一个结合中间件和管道的完整示例:

  1. 中间件:记录请求日志。
  2. 管道:验证请求体数据。
// src/users/users.module.ts
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
import { LoggerMiddleware } from './logger.middleware';
import { ValidationPipe } from './validation.pipe';

@Module({
  controllers: [UsersController],
  providers: [UsersService],
})
export class UsersModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMiddleware)
      .forRoutes(UsersController);
  }
}
// src/users/users.controller.ts
import { Controller, Post, Body, UsePipes } from '@nestjs/common';
import { UsersService } from './users.service';
import { ValidationPipe } from './validation.pipe';

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Post()
  @UsePipes(new ValidationPipe())
  create(@Body() user: any) {
    return this.usersService.create(user);
  }
}
// src/users/users.service.ts
import { Injectable } from '@nestjs/common';

@Injectable()
export class UsersService {
  private users = [];

  findAll() {
    return this.users;
  }

  create(user: any) {
    this.users.push(user);
    return user;
  }
}

总结

中间件和管道是Nest.js中非常重要的组成部分。中间件用于处理请求和响应,可以进行日志记录、请求验证等操作;管道用于数据验证和转换,确保输入数据的有效性。通过理解它们的作用和使用方法,可以更好地管理请求处理流程,提高应用的可靠性和可维护性。

评论区
评论列表
menu