william.chan's blog

done is better than perfect

nestjs 切换不同上下文

为了让 Filter、Guard、Interceptor 支持 http、ws、rpc 等场景下复用,Nest 设计了 ArgumentsHost 和 ExecutionContext 两个类。

ArgumentsHost:抹平多协议参数差异 ArgumentsHost 是一个”参数容器”,它把不同协议下传给 handler 的参数统一封装起来,再提供方法让你按需切换到具体协议拿对应的对象。 核心 API: 方法 作用 getType() 返回当前上下文类型:'http' / 'w...

nestjs Metadata & Reflector

Nest 的实现原理是通过装饰器给 class 或对象添加元数据,然后,初始化的时候取出这些元数据,进行依赖分析,创建对应的实例对象

nest 实现的核心是 Relfect.metadata 的 api 疑问:只是通过装饰器声明了一下,启动nest应用,这时候对象就给创建好了,依赖也给注入了,这是怎么实现的呢? “design:type” “design:paramtypes” “design:returntype” 通过 Refelct.metadata 获取类和对象的元数据 疑...

nestjs 自定义装饰器

Nest 内置了很多装饰器,大多数功能都是通过装饰器来使用

什么时候需要使用自定义装饰器 1.当nest内置装饰器不能满足需求的时候 2.当装饰器比较多,需要把多个装饰器合并成一个的时候 SetMetadata, @SetMetadata:用于给路由打上“元数据”标签。不同的 metadata 有不同的业务场景。 场景举例 1:角色权限控制。有些接口只需登录,有些接口需要 admin 角色。可以用 @SetMetad...

nestjs session & cookie

在 Web 开发中,理解 HTTP 的无状态特性是掌握身份认证的前提。为了让服务器认识“你是谁”,Session 和 Cookie 这对经典的组合应运而生。

我们可以通过一个完整的业务链路,将工作原理、浏览器行为、NestJS 代码实现以及服务端存储方案串联起来,形成一个全局的认知。 1. 核心模型:银行账户与银行卡 HTTP 协议本身是没有记忆的。为了维持状态: Session(会话) 就像你在银行开通的账户,你的余额、信用等级都安全地保存在银行的内网系统(服务器端)里。 Cookie(饼干) 就像银行发给你的银行卡。卡上不...

nestjs 核心装饰器有哪些

NestJS 深度依赖 TypeScript 装饰器(Decorators)来实现依赖注入、路由分发和面向切面编程(AOP)。

NestJS 广泛使用了装饰器(Decorators)来定义和组织代码。以下是 NestJS 中最核心和最常用的一些装饰器,按照它们的功能进行分类: 1. 模块与提供者 (Modules & Providers) @Module(): 用于类,将其标记为 Nest 模块。接收一个对象,包含 imports(导入其他模块)、controllers(当前模块下的控制器)、pro...

AOP 架构

AOP的好处是可以把一些通用逻辑分离到切面中,保持业务逻辑的纯粹性,这样切面逻辑就可以复用,还可以动态增删

MVC 架构 在 MVC 架构下,请求会先发送给 controller,由 controller 调度 model 层的 service 来完成 业务逻辑,然后,返回对应的 view。 在这个流程中,nest 还提供了 AOP(Aspect Oriented Programming)的能力,也就是面向切面编程的能力。 后端框架基本都是 AOP 架构 QA: ruby ...

Nest 全局模块和生命周期

避免重复 imports。支持在创建和销毁时执行一些逻辑。

全局模块 module 导出 provider,另一个 module 需要 imports 它才能用这些 provider。 如果这个模块被很多模块依赖,那每次都要 imports 就很麻烦。 能不能设置成全局的,它导出的 provider 直接可用呢? 1.常用引入模块方式 在 AaaModule 里指定 exports 的 provider 然后,在 BbbModule ...

Nest providers 4种类别

使用多种 provider,灵活注入对象

providers Nest 实现了 IoC 容器,会从入口模块开始扫描,分析 Module 之间的引用关系,对象之间的依赖关系, 自动把 provider 注入到目标对象 什么是provider 被 @Injectable() 修饰的 class 在 @Module() 的 providers 中声明 示例 AppService 1.useClass 上面...

Nest项目断点调试

查看代码整个执行路线 - 作用域,调用栈 - 通过单步执行查看变量变化

在 VSCode 里边写代码边调试 最方便调试 nest 项目的方式 VSCode 实现了 Debugger 客户端 创建 .vscode/launch.json 文件 然后,输入node快速创建一个 node 调试配置 stopOnEntry 是在首行断住,和 –inspect-brk 一样的效果。 调试过程中修改了代码,点击重新调试,可以马上看到改动之...

IoC 解决了什么问题?

IoC 使开发者免去手动创建和组装对象的麻烦,改成声明依赖,让工具自动创建组装对象

nestjs 中有很多对象 Controller 对象,接收 http 请求,调用 service,返回响应 Service 对象,实现业务逻辑 Repository 对象,实现对数据库的增删改查 数据库连接对象 DataSource 配置对象 Config 对象间关系复杂 Controller 依赖 Service 实现业务逻辑 Service 依赖...