首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Nest js中间件和Guard中编写逻辑

在NestJS中,中间件(Middleware)和守卫(Guard)是两种不同的机制,用于在请求处理的不同阶段执行逻辑。下面是如何在这两者中编写逻辑的详细解释。

中间件(Middleware)

基础概念: 中间件是在路由处理器之前执行的函数。它可以访问请求对象(req)、响应对象(res)以及下一个中间件函数(next)。中间件通常用于执行如日志记录、请求体解析、错误处理等横切关注点。

优势

  • 可以全局应用或针对特定路由应用。
  • 执行顺序灵活,易于管理。

类型

  • 全局中间件:应用于所有请求。
  • 路由中间件:仅应用于特定路由。

应用场景

  • 请求日志记录。
  • 数据验证。
  • 错误处理。

示例代码

代码语言:txt
复制
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();
  }
}

在模块中应用中间件:

代码语言:txt
复制
import { Module, MiddlewareConsumer } from '@nestjs/common';
import { AppController } from './app.controller';
import { LoggerMiddleware } from './logger.middleware';

@Module({
  imports: [],
  controllers: [AppController],
})
export class AppModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(LoggerMiddleware).forRoutes('*');
  }
}

守卫(Guard)

基础概念: 守卫是一种特殊的装饰器,用于保护路由。守卫可以在方法执行前进行检查,并决定是否允许请求继续。守卫可以访问请求对象和响应对象,但它们不能修改它们。

优势

  • 集中管理权限和认证逻辑。
  • 可以轻松地应用于多个路由或控制器。

类型

  • 全局守卫:应用于所有请求。
  • 路由守卫:仅应用于特定路由。

应用场景

  • 用户认证。
  • 权限检查。
  • 数据验证。

示例代码

代码语言:txt
复制
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';

@Injectable()
export class AuthGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const request = context.switchToHttp().getRequest();
    return this.validateRequest(request);
  }

  private validateRequest(req: any): boolean {
    // 在这里编写你的验证逻辑
    return req.headers.authorization === 'Bearer valid_token';
  }
}

在控制器或方法上应用守卫:

代码语言:txt
复制
import { Controller, Get, UseGuards } from '@nestjs/common';
import { AuthGuard } from './auth.guard';

@Controller('protected')
export class ProtectedController {
  @Get()
  @UseGuards(AuthGuard)
  getProtectedResource() {
    return 'This is a protected resource';
  }
}

常见问题及解决方法

问题:守卫中的逻辑执行后,如何处理不同的结果? 解决方法

  • 如果守卫返回true,请求将继续。
  • 如果守卫返回false或抛出异常,NestJS将自动返回401 Unauthorized响应。

问题:如何在中间件中处理错误? 解决方法

  • 在中间件中使用try-catch块捕获异常。
  • 如果发生错误,调用next(error)将错误传递给下一个中间件或错误处理中间件。

通过上述方法,你可以在NestJS中有效地使用中间件和守卫来处理各种逻辑需求。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券