- Nest.js从零开始学习
- Nest.js概述
- 环境搭建
- 基本概念
- 依赖注入(Dependency Injection)
- 中间件与管道
- 路由与请求处理
- Nest.js 框架异常处理
- Nest.js 框架数据库操作
- Nest.js 框架认证与授权
- Nest.js 框架 WebSockets 与实时通信
- Nest.js 框架 GraphQL 支持
- Nest.js 框架微服务架构
- Nest.js 框架测试
- Nest.js 框架性能优化与安全
- Nest.js 项目实战:创建一个完整的用户管理应用
中间件与管道
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()
:用于在控制器或路由处理函数上应用管道。
整体的使用示例
以下是一个结合中间件和管道的完整示例:
- 中间件:记录请求日志。
- 管道:验证请求体数据。
// 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中非常重要的组成部分。中间件用于处理请求和响应,可以进行日志记录、请求验证等操作;管道用于数据验证和转换,确保输入数据的有效性。通过理解它们的作用和使用方法,可以更好地管理请求处理流程,提高应用的可靠性和可维护性。
评论区
评论列表
{{ item.user.nickname || item.user.username }}