如何在 NestJS 中创建和使用装饰器和中间件
装饰器和中间件是 NestJS 的基础——这些工具可以让你的生活变得非常简单,也可以让你有点不知所措,具体取决于你如何处理它们。
今天,让我们逐步创建用于用户身份验证的自定义装饰器和中间件,同时保持简单明了。拿起你的咖啡,让我们开始吧!
1. 界面
首先,让我们为用户对象定义一个接口。
这将确保类型安全并让我们的 IDE 保持快乐(谁不喜欢快乐的 IDE?)。
export interface IUser { id: string; name: string; primaryEmail: string; phoneNumber: string | null; countryCode: string | null; dob: Date | null; createdAt: Date; updatedAt?: Date; deletedAt?: Date | null; }
2. 创建自定义装饰器
自定义装饰器就像 NestJS 应用程序中的酷孩子。
在这里,我们正在制作一个从请求对象中获取用户元数据的方法。
import { createParamDecorator, ExecutionContext } from '@nestjs/common'; import { IUser } from '../interface/user.interface'; export const UserMetadata = createParamDecorator( (_data: unknown, ctx: ExecutionContext) => { const request = ctx.switchToHttp().getRequest(); return request.user as IUser; }, );
就是这样!现在可以使用此装饰器直接在控制器方法中提取用户信息。
3. 创建Auth中间件
现在,让我们创建一个 AuthGuard 来像虚拟保镖一样保护我们的端点。
import { CanActivate, ExecutionContext, ForbiddenException, Injectable } from '@nestjs/common'; import { Reflector } from '@nestjs/core'; import { verify } from 'jsonwebtoken'; import { Observable } from 'rxjs'; import { IS_PUBLIC_KEY } from '../constant/core'; import { IUser } from '../interface/user.interface'; @Injectable() export class AuthGuard implements CanActivate { constructor( private reflector: Reflector, ) { } canActivate( context: ExecutionContext, ): boolean | Promise<boolean> | Observable<boolean> { const isPublic = this.reflector.getAllAndOverride<boolean>(IS_PUBLIC_KEY, [ context.getHandler(), context.getClass(), ]); if (isPublic) { return true; } const request = context.switchToHttp().getRequest(); const headers = request.headers; const token = (headers['authorization'] || '').split(' ')[1]; if (!token) { throw new ForbiddenException('Not Authenticated'); } const jwtOpts = { expiresIn: '1h', // Replace with env vars in real use audience: 'your-audience', algorithm: 'HS256', issuer: 'your-issuer', }; try { const decoded = verify(token, "my-jwt-secret-token", { audience: jwtOpts.audience, issuer: jwtOpts.issuer, }) as { user: IUser }; request.user = decoded.user; return true; } catch (err) { throw new ForbiddenException('Session Expired or Invalid'); } } }
4. 添加公共和内部路由的元数据
有些路由应该是公共的(例如登录),有些可能是内部的。
让我们为此添加两个简单的装饰器。
import { SetMetadata } from '@nestjs/common'; export const IS_PUBLIC_KEY = 'isPublic'; export const IS_INTERNAL = 'isInternal'; export const Public = () => SetMetadata(IS_PUBLIC_KEY, true); export const Internal = () => SetMetadata(IS_INTERNAL, true);
5. 在控制器中使用它们
最后,以下是您如何在控制器中使用所有这些内容。
import { Controller, Get, UseGuards } from '@nestjs/common'; import { UserMetadata } from '../decorators/user.decorator'; import { AuthGuard } from '../guards/auth.guard'; import { Public } from '../decorators/public.decorator'; @Controller('users') export class UserController { @Public() @Get('login') login() { return { message: 'Login endpoint (public)' }; } @UseGuards(AuthGuard) @Get('profile') getProfile(@UserMetadata() user: IUser) { return { message: 'User Profile', user, }; } }
总结
就是这样!您已经创建了自定义装饰器、中间件和元数据装饰器来管理公共路由。
使用这些工具,您可以在 NestJS 中构建安全且有组织的 API。
如果这感觉太多了,请记住 - 即使罗马也不是一天建成的,但您的 API 绝对可以更快地扩展!
随意调整和试验这些片段。
NestJS 的无限可能! ?
我一直在开发一个名为 LiveAPI 的超级方便的工具。
它旨在让开发人员轻松编写 API 文档。
使用LiveAPI,您可以快速生成交互式API文档,允许用户直接从浏览器执行API。
如果您厌倦了为 API 手动创建文档,这个工具可能会让您的生活变得更轻松。


从 Lama2 到 LiveAPI:构建超级便捷的 API 文档(第二部分)
Hexmos 的 Athreya 又名 Maneshwar ・ 2024 年 12 月 14 日
以上是如何在 NestJS 中创建和使用装饰器和中间件的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

Python和JavaScript在开发环境上的选择都很重要。1)Python的开发环境包括PyCharm、JupyterNotebook和Anaconda,适合数据科学和快速原型开发。2)JavaScript的开发环境包括Node.js、VSCode和Webpack,适用于前端和后端开发。根据项目需求选择合适的工具可以提高开发效率和项目成功率。
