一文入门【NestJs】Middleware

🚩 引言

在NestJS中,中间件(Middleware)扮演着一个关键角色,它为开发者提供了在请求到达控制器之前或响应发送之后执行自定义逻辑的能力。中间件是Node.js世界中一个广为人知的概念,NestJS通过其独特的实现,让这一概念更加优雅和易于集成。

🚩什么是 Middleware?

在NestJS的上下文中,中间件是一种可以拦截进入应用程序的请求并在其达到控制器之前执行特定任务的机制。它可以用于执行一系列操作,比如日志记录、身份验证、请求体解析、错误处理等。中间件的灵活性使得它成为增强应用功能和性能的重要工具。
在这里插入图片描述

🚩如何定义 Middleware

nest ng middleware logger

在函数中或在具有 @Injectable() 装饰器的类中实现自定义 Nest 中间件。类应实现 NestMiddleware 接口,功能无特殊要求。让我们从使用类方法实现一个简单的中间件函数开始。

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 method: ${req.method}`);
    console.log(`Request url: ${req.url}`);
    console.log(`Request body: ${req.body}`);
    next();
  }
}

🚩应用Middleware

@Module 装饰器中不能使用中间件,我们必须在根模块中设置,包含中间件的模块必须实现 NestModule接口。
在这里插入图片描述

我们还可以通过在配置中间件时将包含路由 path 和请求 method 的对象传递给 forRoutes() 方法,进一步将中间件限制为特定的请求方法。在下面的示例中,请注意我们导入了 RequestMethod 枚举以引用所需的请求方法类型,也可以通过 * 号通配符来匹配所有的路由。
在这里插入图片描述

🚩排除路由

有时我们希望排除某些路由应用中间件。我们可以使用 exclude() 方法轻松排除某些路由
在这里插入图片描述

🚩全局中间件

如果我们想一次将中间件绑定到每个已注册的路由,我们可以使用 INestApplication 实例提供的 use() 方法,在main.ts 中使用即可。
在这里插入图片描述

🚩结语

掌握NestJS中的中间件机制,意味着你能够更精细地控制请求处理过程,增强应用的安全性、性能和功能性。无论是在开发阶段调试,还是在生产环境中优化,中间件都是你不可或缺的工具。随着你对NestJS的深入了解,你将发现中间件在构建健壮、高效的后端服务中的无限潜力。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Casbin是一个强大的访问控制框架,可以为应用程序提供基于角色的访问控制(RBAC)和其他访问控制模型。NestJS是一个基于Node.js的开发框架,它使用现代的JavaScript或TypeScript语言进行开发,并且非常适合构建高度可扩展的应用程序。 在NestJS中使用Casbin,你需要安装`@casbin/node-casbin`包。然后,你需要在你的NestJS应用程序中创建一个中间件来处理请求并执行访问控制检查。以下是一个基本的示例: ```typescript import { Injectable, NestMiddleware } from '@nestjs/common'; import { Request, Response, NextFunction } from 'express'; import { newEnforcer } from 'casbin'; @Injectable() export class CasbinMiddleware implements NestMiddleware { async use(req: Request, res: Response, next: NextFunction) { const enforcer = await newEnforcer('path/to/model.conf', 'path/to/policy.csv'); const { user } = req; const { method, originalUrl: path } = req; const allowed = await enforcer.enforce(user.role, path, method); if (!allowed) { res.status(403).json({ message: 'Forbidden' }); return; } next(); } } ``` 在上面的示例中,我们首先导入了必要的依赖项,包括`@casbin/node-casbin`和NestJS的中间件相关依赖项。然后,我们创建了一个`CasbinMiddleware`类,它实现了`NestMiddleware`接口。在`use`方法中,我们首先使用`newEnforcer`方法创建了一个新的Casbin实例,然后获取了当前请求的用户角色、请求方法和请求路径,并使用`enforce`方法执行了访问控制检查。如果检查未通过,则返回403错误。如果检查通过,则调用`next()`方法继续处理请求。 最后,我们需要将中间件添加到我们的应用程序中。你可以在`app.module.ts`文件中将中间件注册为全局中间件,也可以将其添加到特定的控制器或路由上。以下是一个示例: ```typescript import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common'; import { CasbinMiddleware } from './casbin.middleware'; import { AppController } from './app.controller'; @Module({ imports: [], controllers: [AppController], }) export class AppModule implements NestModule { configure(consumer: MiddlewareConsumer) { consumer.apply(CasbinMiddleware).forRoutes('*'); } } ``` 在上面的示例中,我们将`CasbinMiddleware`添加为全局中间件,并将其应用于所有路由。你也可以使用`forRoutes`方法指定特定的路由。 这只是一个基本示例,你可以根据需要进行调整和扩展。希望这可以帮助你在NestJS中使用Casbin实现访问控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值