- 博客(1386)
- 收藏
- 关注
原创 Nestjs框架: NestJS 其核心设计逻辑与模块化架构
摘要: NestJS虽比轻量级HTTP框架(如Express、Koa)更复杂,但其成熟生态和模块化设计能显著提升开发效率。选择NestJS的核心原因在于避免重复造轮子,其内置的依赖注入、装饰器等功能覆盖了数据校验、数据库操作、权限控制等通用场景。针对“NestJS太重”的痛点(如TypeScript门槛、Angular/Spring架构思想),可通过封装通用模块降低学习成本。框架设计围绕“请求-响应”流程,关键包括:数据校验(class-validator)、数据库连接(TypeORM)、权限控制(Guar
2025-08-02 09:15:00
1013
原创 Nestjs框架: 请求生命周期与应用生命周期
NestJS请求生命周期组件详解 NestJS的请求处理流程包含多个关键组件,按执行顺序依次为:中间件(处理请求预处理)、守卫(权限验证)、拦截器(请求/响应处理)、管道(数据转换验证)、控制器(业务逻辑)、异常过滤器(错误处理)。这些组件共同构成了完整的请求生命周期,与应用生命周期钩子(如模块初始化)不同,专注于单次HTTP请求的处理流程控制。开发者可通过全局、控制器或路由级注册方式灵活组合这些组件,实现日志记录、权限控制、数据验证等通用功能,保持业务代码简洁性。
2025-08-01 20:15:00
273
原创 Nestjs框架: 深入理解 MVC 架构 与 DTO 和 DAO 模式
本文介绍了MVC架构在NestJS框架中的实现方式,重点解析了DTO和DAO设计模式的应用。MVC架构通过分层设计(Model-View-Controller)实现高内聚低耦合,NestJS中通过控制器(Controller)处理请求,服务(Service)实现业务逻辑,结合模板引擎或前端框架实现视图层。文中详细说明了DTO用于数据传输和校验,DAO负责数据库访问操作,并通过代码示例展示了如何定义实体类、创建DTO和实现DAO层。最后提供了技术术语对照表和学习建议,帮助开发者掌握分层架构设计思想。
2025-08-01 08:45:00
608
原创 Nestjs框架: NestJS 核心机制解析 —— DI(依赖注入)容器与模块化工作原理
在 NestJS 中,模块(Module)是组织代码的核心单位,通过模块间的引用关系,我们可以构建复杂的依赖网络。3 ) 构造函数中的依赖注入(Constructor Injection)3 ) 缺少 exports 或 providers 导致的访问失败。1 ) 注解(Decorator)与 @Injectable()1 ) 控制反转(IoC)与依赖注入(DI)的本质。2 ) DI 容器(DI Container)2 ) 多模块嵌套下的依赖混乱。
2025-07-31 18:00:03
646
原创 Nestjs框架: 深入理解 IOC 与 DI —— 面向对象编程中的控制反转与依赖注入
摘要: IOC(控制反转)与DI(依赖注入)是现代框架的核心设计模式,通过将对象创建和管理权交给外部容器,降低代码耦合度。DI作为IOC的实现方式,通过注入依赖(如构造函数参数)而非内部创建,提升可扩展性。示例展示了传统强依赖(如Student直接实例化IPhone)的问题,以及通过接口抽象和动态注入(如Android实现Phone接口)的解耦方案。实际意义包括增强代码复用、模块化开发支持及框架底层机制(如NestJS的自动依赖注入)。借助Reflect Metadata可实现自动化依赖注入,简化开发流程。
2025-07-31 07:45:00
428
原创 Nestjs框架: 面向切面编程 AOP
AOP(面向切面编程)是一种通过分离横切关注点(如日志、权限等)来提高代码模块化的编程范式。它能在不修改原有业务逻辑的情况下,通过"织入"方式实现功能增强。与OOP相比,AOP更适合处理跨多个模块的通用功能,解决了OOP在代码复用和维护性上的不足。NestJS提供了拦截器等机制实现AOP,如日志拦截器示例所示,通过非侵入式方式为业务方法添加日志功能,保持业务代码纯净。AOP的主要优势包括解耦关注点、提高可维护性、增强扩展性等,是对OOP的重要补充。
2025-07-30 19:45:00
1588
原创 Nestjs框架: 关于 OOP / FP / FRP 编程
本文对比了三种编程范式(OOP、FP、FRP)在前端开发中的实现方式。以登录注册功能为例,详细展示了面向过程编程、函数式编程和面向对象编程的不同实现路径。面向过程编程采用顺序执行方式,代码直接但耦合度高;函数式编程通过纯函数组合实现,强调无副作用和可复用性;面向对象编程则通过类封装逻辑,提供更好的模块化组织。三种范式各具特点:FP适合数据处理与逻辑解耦,OOP擅长复杂系统建模,FRP则专精异步事件流处理。开发者应根据具体场景选择合适的编程范式,甚至组合使用以获得最佳效果。
2025-07-30 18:45:00
892
原创 Nestjs框架: 多租户与多数据库的架构设计与实现
本文介绍了在NestJS项目中实现多数据库对接的方案,重点解决多租户架构下的数据隔离与灵活切换需求。通过抽象层统一接口,结合TypeORM、Prisma和Mongoose三种ORM库,支持MySQL、PostgreSQL和MongoDB等多种数据库类型。方案采用外观模式+抽象工厂模式+策略模式,通过DatabaseModule集中管理数据库连接,根据租户ID动态切换不同数据库配置。文章详细阐述了环境变量设计、目录结构和模块实现,为复杂业务场景下的多数据库管理提供了可行方案。
2025-07-28 23:32:49
1191
原创 Nestjs框架: 基于Mongodb的多租户功能集成和优化
MongoDB多租户集成 本文介绍了在NestJS中实现MongoDB多租户的步骤: 通过docker-compose配置两个MongoDB实例(端口27018和27019) 环境变量设置不同租户的数据库连接URI 创建租户映射关系(租户ID对应数据库配置前缀) 实现Mongoose配置服务,根据请求头x-tenant-id动态选择连接 在AppModule中集成配置服务和Mongoose模块 关键点包括:动态URI获取、租户ID验证、默认租户设置等。该方案支持根据不同租户请求自动切换数据库连接。
2025-07-26 20:21:30
535
1
原创 Nestjs框架: 基于Prisma的多租户功能集成和优化
本文介绍了Prisma多租户数据库连接方案的核心实现。通过修改schema.prisma文件中的generator配置,将不同数据库(MySQL/PostgreSQL)的客户端生成到指定目录(./clients/)。关键点包括:1)利用占位URL生成客户端,实际连接在运行时动态注入;2)通过pnpm link方式管理多数据库客户端依赖;3)设计模块化结构(prisma-core.module等)支持多租户场景。方案解耦了客户端生成和运行时连接,支持异构数据库混合使用,同时需要注意占位URL格式要求和运行时连
2025-07-23 19:15:52
678
原创 Nestjs框架: RxJS 核心方法实践与错误处理详解
本文介绍了RxJS的核心方法实践与错误处理机制。首先演示了timer创建定时Observable的基本用法;其次展示了retry与catchError配合实现错误重试和捕获,适用于网络请求等场景;最后通过defer延迟创建Observable,结合lastValueFrom获取最终值。这些方法能有效提升异步任务、网络请求等场景的代码健壮性,建议结合官方文档深入掌握其应用技巧。
2025-07-19 23:42:27
339
原创 Nestjs框架: 理解 RxJS响应式编程的核心概念与实践
RxJS是一个用于处理异步和事件编程的库,核心是通过可观察序列(Observables)管理数据流。它提供Observable、Observer、Subject等核心类型,以及map、filter、throttleTime等操作符,能链式处理事件流。相比传统回调,RxJS通过pipe串联操作符使代码更清晰,并支持纯函数管理状态。例如用fromEvent监听点击事件,配合scan计数或throttleTime节流,避免外部变量污染。推荐参考rxjs.tech等中文文档学习,注意标记为弃用的功能。RxJS简化了
2025-07-19 23:41:25
1144
原创 Nestjs框架: 关于controller中的常用装饰器
本文介绍了NestJS中获取请求参数的常用装饰器使用方法。通过示例展示了如何利用@Query()、@Param()、@Body()和@Headers()装饰器分别获取URL查询参数、路由参数、请求体和请求头信息。文章提供了一个测试控制器的完整代码示例,并配合curl请求演示了各参数的实际获取效果,最后返回了包含所有提取参数的对象。这些装饰器为处理HTTP请求提供了便捷的方式,特别在多租户系统中常用于获取租户标识。
2025-07-18 21:56:20
342
原创 Nestjs框架: 基于TypeORM的多租户功能集成和优化
本文介绍了如何通过Docker Compose配置多租户数据库环境(包含2个MySQL和1个PostgreSQL实例),并集成到NestJS项目中。首先展示了docker-compose配置文件,详细说明了三个数据库服务的端口映射、数据卷挂载等关键配置。接着通过Adminer工具验证数据库连接并创建测试库。然后重点讲解了TypeORM CLI的配置方法,包括环境变量设置、ORM配置文件编写以及数据库同步脚本的创建。最后提供了针对不同数据库的.env配置示例,并说明了如何执行TypeORM同步命令来初始化数据
2025-07-18 21:52:23
1299
原创 Nestjs框架: 数据库架构设计与 NestJS 多 ORM 动态数据库应用与连接池的配置
本文探讨了多租户系统中的数据库架构设计方案,分析了四种典型架构的优缺点和应用场景。架构1是单数据库简单方案,架构2通过ORM库对接多个数据库提升扩展性,架构3采用多ORM库对接动态数据库,架构4结合微服务实现租户隔离。文章指出架构选择需考虑安全性、性能、扩展性等因素,多租户系统需处理逻辑/物理隔离、多样性管理、迁移复杂性等问题。建议根据业务需求选择合适架构,并利用连接池等技术优化性能。系统架构设计应关注核心业务,通过技术倒逼学习提升架构能力。
2025-07-15 23:47:21
559
原创 Nestjs框架: 数据库多租户模式与动态模块初探
本文探讨了如何通过动态模块和依赖注入实现多租户数据库系统的集成。文章首先概述了TypeORM、Prisma和Mongoose三种ORM框架的基本连接方式,重点分析了Prisma在多库场景下的动态配置需求。通过研究Prisma的文档,提出了通过程序化覆盖数据源URL的方案,将连接信息拆分为独立字段管理。随后深入剖析了NestJS动态模块的实现原理,通过分析TypeORM模块源码和官方文档示例,展示了如何通过forRootAsync方法实现配置的动态注入。最后,文章通过一个多租户场景案例,阐述了如何利用动态模块
2025-07-15 19:02:40
1024
原创 Nestjs框架: 集成 TypeORM 和 Mongoose
这篇文章介绍了在NestJS项目中集成TypeORM和Mongoose两种数据库操作工具的方法。主要内容包括:1) TypeORM的安装配置、实体创建和控制器编写;2) Mongoose的安装配置、Docker环境搭建、Schema定义和控制器实现。文章通过代码示例详细展示了两种工具的具体集成步骤,并提供了测试验证方法。两种工具各有优势,TypeORM在关键性数据库场景兼容性更好,而Prisma则提供更简便的使用体验和优秀的TypeScript支持。
2025-07-07 19:30:00
439
原创 Nestjs框架: 集成 Prisma
NestJS官方文档提供了两种数据库相关的内容:Techniques下的数据库板块和Recipes下的具体数据库集成方案。本文以Prisma为例,演示了如何集成Prisma到NestJS项目中。首先创建NestJS项目并安装Prisma,配置MySQL数据库连接。通过Prisma CLI初始化项目、定义数据模型并生成迁移文件。接着创建Prisma模块和服务,配置Prisma客户端连接数据库。最后在控制器中注入PrismaService实现数据查询。整个过程包含了Docker启动MySQL、Prisma模型定
2025-07-06 21:06:07
806
原创 Nestjs框架: 数据库的多种选择,与单库和多库的分析
NestJS 本身和数据库并无直接关联,它的底层使用 Express 或者 Fastify 来提供 HTTP 接口服务- 在数据库方面,NestJS 使用 Node.js 端的一些驱动,也就是 NestJS 端的数据库驱动来与数据库进行对接。- 不过,它更推荐使用一些 ORM(对象关系映射)库来与数据库对接- 主要原因在于,这些 ORM 库能够与各式各样的数据库进行对接,做到“开箱即用”(out of the box)- 我们无需根据不同的驱动或者不同的数据库去定制不同的逻辑代码- 官方指出,市
2025-07-06 10:52:49
973
原创 Nestjs框架: Nestjs 复杂企业应用场景架构设计分析
架构设计是解决软件系统复杂度问题的关键过程,将系统分解为组件并明确其交互方式。常见五大误区包括需求不明确、过度设计、照搬大公司方案、技术极端化和实践拖延。架构可分为系统、软件、数据、网络和安全架构等类型,常用模式有层次架构、微服务、事件驱动等。设计工具包括UML工具、ProcessOn等,验证方法包含架构评审和测试手段。最终目的是用最小成本满足业务需求,通过组件抽象为技术落地提供参考。
2025-06-30 21:27:06
745
原创 Nestjs框架: NestJS项目数据库迁移与版本控制实践指南
本文介绍了NestJS项目中数据库迁移与版本控制的最佳实践。重点包括:使用Prisma CLI生成迁移脚本并导出数据库结构和数据;通过规范命名和精简版本管理迁移记录;采用Git标签标记关键版本;优化分支策略;以及制定数据恢复流程和脏数据处理方案。建议将Prisma迁移与数据库导出结合使用,协同Git工作流实现全链路版本控制,同时强调开发环境数据管理的重要性。这些实践为后续业务模块开发提供了可靠的技术基础。
2025-06-30 20:32:21
536
原创 Nestjs框架: nestjs-bull的使用与相关queue的规划
摘要: NestJS定时任务在处理大量高并发或秒级任务时存在内存占用问题,推荐使用基于Redis的队列方案nestjs-bull。该方案支持生产者、消费者和监听者模式,适用于多种场景(如邮件、数据处理、订单处理等)。配置时需设置Redis连接参数(单节点或哨兵模式),并通过BullModule动态注册队列。任务支持延迟执行、优先级、重试策略等高级选项。示例展示了如何创建队列、添加任务(如延迟发送邮件)及编写消费者逻辑,使用dayjs处理时间计算。该方案优化了任务调度效率,适合复杂业务场景。
2025-06-27 23:46:11
790
原创 Nestjs框架: nestjs-schedule模块中的三类定时任务
定时任务管理方案摘要 NestJS定时任务主要分为三类:周期性任务(如每日签到)、简单状态检查任务和轻量级任务。通过@nestjs/schedule模块实现,支持动态添加、删除和查询任务状态。典型实现包含任务服务类(管理任务生命周期)、定时服务类(具体业务逻辑)和模块整合。对于需要精确到分秒或高并发的任务(如消息推送),建议使用task queue方案(如Bull+Redis)。代码示例展示了MongoDB日志备份的定时任务实现,包括任务注册、执行和清理逻辑。该方案适用于中等规模系统,将定时任务集中管理在c
2025-06-27 19:00:00
1147
原创 Nestjs框架: nestjs-schedule模块注册流程,源码解析与定时备份数据库
摘要 NestJS定时任务提供跨平台的定时任务解决方案,比系统级脚本更灵活。通过@nestjs/schedule模块,可以创建静态或动态定时任务,支持日志备份、计划提醒等场景。配置时需安装依赖并设置环境变量CRON_ON=true,在AppModule或ConditionalModule中注册ScheduleModule。定时任务服务类使用@Cron装饰器定义执行频率,系统启动时自动注册。该方案不受平台限制,只需Node.js环境即可运行,并支持动态添加任务。源码显示任务在onApplicationBoot
2025-06-06 21:10:10
1155
4
原创 Nest框架: 日志功能之收集,筛选,存储,维护
文章摘要:NestJS日志系统优化与MongoDB存储方案 本文探讨了NestJS项目中日志系统的优化方案。传统文件存储方式存在IO占用、数据处理不便等问题,提出使用winston-mongodb将日志存入数据库的解决方案。通过配置MongoDB Transport,可实现日志集中存储、高效筛选和多服务汇总。文章详细介绍了winston-mongodb的安装、配置方法及transport选项,对比分析了文件存储与数据库存储的优缺点,为分布式系统日志管理提供了实践指导。该方案特别适用于多节点部署场景,有效解决
2025-06-06 20:45:00
1817
原创 Monorepo架构: Nx Cloud 扩展能力与缓存加速
摘要 本文系统探讨了如何利用Nx Cloud实现项目协同与构建加速。首先分析了缓存工作原理,包括本地与远程缓存机制及其优势。详细介绍了连接Nx Cloud的步骤,包括创建组织、工作区,以及远程缓存的实践操作与权限管理。此外,对比了Nx与其他工具的差异,重点解析了NX Graph可视化功能、Agents分布式任务特性,以及与GitHub Actions的集成方案。针对中小企业成本问题,提出
2025-06-05 22:30:00
1707
原创 Monorepo架构: Lerna、NX、Turbo等对比与应用分析
文章摘要 在大型Monorepo项目中,Nx、Turbo、Lerna和Rush是主流工具。Nx下载量最高,生态成熟,支持构建优化、任务并行和分布式计算;Lerna专注于版本管理和发布,可与Nx互补。Turbo作为轻量构建工具,性能稍逊于Nx且缺少插件生态。Rush由微软维护,依赖隔离设计更贴近Node习惯,但扩展性较弱。Lerna提供缓存、版本控制和高效发包能力,适合CI场景;Turbo简化Monorepo初始化,但功能较基础。综合来看,Nx适合复杂构建需求,Lerna长于版本管理,Turbo适合轻量级场景
2025-06-05 20:15:00
1212
原创 Monorepo架构: 项目管理工具介绍、需求分析与技术选型
如何实现 monorepo,以及在项目中如何管理多个包,在进行具体项目开发前,有必要强调一个重要思维 — 全局观即看待技术方案时,要从需求角度出发,综合考量该方案能否长远满足项目或团队需求为什么要有全局观呢?如果直接拿一个项目,用特定工具创建工作区间并将其作为 monorepo 项目使用,虽直观易感受,但当技术更新时,这种思维方式就会落后若站在更高视角了解新技术、新方向,先梳理相关工具,明确哪些工具可满足需求,虽前期会花费一些时间,但后续不论遇到何种工具,都能清楚其用途。
2025-06-04 22:00:00
1098
原创 Monorepo架构: 项目管理模式对比与考量
这篇文章探讨了三种项目管理模式:单体应用(monolithic)、多仓库(multirepo)和monorepo。单体应用适合小型项目但耦合度高;多仓库便于模块复用但管理复杂;monorepo在单一仓库管理多个模块,平衡了代码复用与维护成本。文章以Vue项目为例说明模块划分标准,并介绍使用GitHub Actions统计代码量来评估项目复杂度。最后指出monorepo是当前热门的前端项目管理方案,适合中等规模项目。
2025-06-04 19:00:00
1001
原创 数据结构与算法之数组: LeetCode 905. 按奇偶排序数组 (Ts版)
解释:[4,2,3,1]、[2,4,1,3] 和 [4,2,1,3] 也会被视作正确答案。返回满足此条件的 任一数组 作为答案。2 ) 方案2: 双指针 + 一次遍历。1 ) 方案1: 两次遍历。3 ) 方案3: 原地交换。
2025-02-12 22:45:00
324
原创 数据结构与算法之栈: LeetCode 2454. 下一个更大元素 IV (Ts版)
请你返回一个整数数组 answer ,其中 answer[i]是 nums[i] 的第二大整数。下标为 0 处:2 的右边,4 是大于 2 的第一个整数,9 是第二个大于 2 的整数。下标为 1 处:4 的右边,9 是大于 4 的第一个整数,6 是第二个大于 4 的整数。下标为 2 处:0 的右边,9 是大于 0 的第一个整数,6 是第二个大于 0 的整数。下标为 3 处:右边不存在大于 9 的整数,所以第二大整数为 -1。下标为 4 处:右边不存在大于 6 的整数,所以第二大整数为 -1。
2025-02-05 10:45:00
584
原创 数据结构与算法之栈: LeetCode 556. 下一个更大元素 III (Ts版)
给你一个正整数 n ,请你找出符合条件的最小整数,其由重新排列 n 中存在的每位数字组成,并且其值大于 n。如果不存在这样的正整数,则返回 -1。注意 ,返回的整数应当是一个 32 位整数 ,如果存在满足题意的答案,但不是 32 位整数 ,同样返回 -1。1 ) 方案1:下一个排列。2 ) 方案2:数学。
2025-02-05 06:45:00
549
原创 数据结构与算法之二叉树: LeetCode 116. 填充每个节点的下一个右侧节点指针 (Ts版)
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,‘#’ 标志着每一层的结束。填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。初始状态下,所有 next 指针都被设置为 NULL。2 ) 方案2:使用已建立的 next 指针。
2025-02-03 10:00:00
392
1
原创 数据结构与算法之字符串: LeetCode 117. 填充每个节点的下一个右侧节点指针 II (Ts版)
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),‘#’ 表示每层的末尾。填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。2 ) 方案2:使用已建立的 next 指针。1 ) 方案1:层次遍历。
2025-02-03 09:45:00
321
原创 数据结构与算法之异步: LeetCode 1114. 按序打印 (Ts版)
输入 [1,2,3] 表示线程 A 将会调用 first() 方法,线程 B 将会调用 second() 方法,线程 C 将会调用 third() 方法。输入 [1,3,2] 表示线程 A 将会调用 first() 方法,线程 B 将会调用 third() 方法,线程 C 将会调用 second() 方法。请设计修改程序,以确保 second() 方法在 first() 方法之后被执行,third() 方法在 second() 方法之后被执行。三个不同的线程 A、B、C 将会共用一个 Foo 实例。
2025-02-03 09:15:00
412
原创 数据结构与算法之栈: LeetCode 3100. 换水问题 II (Ts版)
注意,你不能使用相同的 numExchange 值交换多批空水瓶。例如,如果 numBottles == 3 并且 numExchange == 1 ,则不能用 3 个空水瓶交换成 3 个满水瓶。解释:上表显示了满水瓶的数量、空水瓶的数量、numExchange 的值,以及累计喝掉的水瓶数量。解释:上表显示了满水瓶的数量、空水瓶的数量、numExchange 的值,以及累计喝掉的水瓶数量。numBottles 代表你最初拥有的满水瓶数量。给你两个整数 numBottles 和 numExchange。
2025-02-03 08:30:00
424
原创 数据结构与算法之贪心: LeetCode 1518. 换水问题 (Ts版)
超市正在促销,你可以用 numExchange 个空水瓶从超市兑换一瓶水。最开始,你一共购入了 numBottles 瓶水。给你两个整数 numBottles 和 numExchange ,返回你 最多 可以喝到多少瓶水。所以最多能喝到 15 + 3 + 1 = 19 瓶水。所以最多能喝到 9 + 3 + 1 = 13 瓶水。如果喝掉了水瓶中的水,那么水瓶就会变成空的。解释:你可以用 3 个空瓶兑换 1 瓶水。解释:你可以用 4 个空瓶兑换 1 瓶水。1 ) 方案1:模拟。2 ) 方案2:数学。
2025-02-03 06:15:00
453
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人