文章目录
- 1 为什么放着Express不用,非要折腾NestJS?
- 1.1 俩框架到底差在哪
- 2 三分钟搭起你的第一个NestJS项目
- 2.1 几行命令就完事
- 3 三个核心概念搞懂,NestJS就入门一半了
- 3.1 模块:应用里的各个部门
- 3.2 控制器:专门接请求的前台
- 3.3 服务:真正埋头干活的打工人
- 3.4 三者到底是什么关系
- 4 别手动建文件了,CLI一键生成不香吗
- 5 管道:数据进来的第一道安检门
- 5.1 管道+DTO的标准三步走
- 5.2 全局开启,一劳永逸
- 6 请求链路上的四道关卡,别再搞混了
- 6.1 执行顺序先记死
- 6.2 中间件:最早的门卫大爷
- 6.3 守卫:查权限的安检员
- 6.4 拦截器:给结果打包的包装员
- 6.5 一张表给你捋明白
- 7 NestJS里的MVC,到底是怎么落地的
- 8 模块不是只能一配一,别把自己框死
- 9 接上LangChain,给你的后端装上AI大脑
- 9.1 先把依赖装了
- 9.2 注册LangChain模块
- 9.3 在服务里直接调用AI
- 9.4 最绝的玩法:把服务方法变成AI工具
- 10 做AI应用的几个实战建议
- 11 最后唠两句
P.S. 目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。
1 为什么放着Express不用,非要折腾NestJS?
很多人刚写Node后端,第一个碰的都是Express。
这玩意儿是真自由,文件夹想怎么建就怎么建,代码想堆在哪就堆在哪,写个小demo快得飞起。
可等项目做大、团队人一多,这份自由就成了噩梦。
新人接手项目,找个接口找半小时;改一行代码,牵一发动全身报一堆错。到最后项目成了没人敢碰的烂摊子,谁接谁倒霉。
1.1 俩框架到底差在哪
说白了,Express给你无拘无束的自由,NestJS给你条条框框的规范。
| 特性 | Express.js | NestJS |
|---|---|---|
| 架构风格 | 极简、无固定模式 | 模块化、分层架构 |
| TypeScript支持 | 手动配置半天 | 原生支持,开箱即用 |
| 依赖注入 | 自己手动引,引到晕 | 内置DI容器,要啥给啥 |
| 代码组织 | 开发者随便造 | 模块系统强制规范 |
| 可维护性 | 小项目爽,大项目炸 | 天生适配大型项目 |
尤其是做AI应用这种逻辑复杂、要长期迭代的项目,规范的架构能帮你少踩80%的坑。
2 三分钟搭起你的第一个NestJS项目
别自己从零搭配置了,纯纯浪费时间。
官方CLI直接给你把所有环境都配好,TS严格模式、编译配置、启动脚本,啥都不用你管。
2.1 几行命令就完事
打开终端,依次敲这几行:
# 安装 NestJS CLInpmi-g@nestjs/cli# 创建项目,开启TS严格模式nest new my-ai-app--strict# 进目录cdmy-ai-app# 启动开发服务npmrun start:dev完事打开浏览器访问 localhost:3000,看到Hello World就成了。
生成的项目结构也很清晰,入口、根模块、控制器、服务,分的明明白白。
搁以前自己搭Express+TS,光配置文件就得写俩小时,还没写业务呢人先累瘫了。
3 三个核心概念搞懂,NestJS就入门一半了
很多人说NestJS难,其实核心就三样:模块、控制器、服务。
把这仨搞明白,剩下的都是锦上添花的东西。
3.1 模块:应用里的各个部门
你可以把一个模块当成公司里的一个部门。
技术部、运营部、财务部,各管各的事,互不干扰。需要协作的时候,走正规流程对接就行。
每个Nest应用至少有一个根模块,剩下的按功能拆,用户模块、订单模块、AI模块,怎么清晰怎么来。
用@Module()装饰器一标记,里面注册好控制器和服务,一个部门就组建完成了。
3.2 控制器:专门接请求的前台
控制器就是公司的前台接待。
客户(请求)来了,前台先登记一下,看看是来办什么事的,然后转给对应的部门处理。
它只管路由转发和返回结果,绝对不写业务逻辑。
很多新手图省事,把所有代码全堆控制器里,一个文件上千行,美其名曰“简单”,等后期维护的时候哭都来不及。
至于参数怎么拿,记住三个常用装饰器就行:
- @Param():拿URL路径里的参数,比如/users/123里的123
- @Query():拿问号后面的参数,比如?page=1里的page
- @Body():拿请求体里的JSON数据
别再三个东西傻傻分不清楚,写接口全靠蒙了。
3.3 服务:真正埋头干活的打工人
前台把单子递进来,真正干活的是服务层。
所有的业务逻辑、数据处理、数据库操作,全写在服务里。
用@Injectable()装饰器标记一下,就可以通过依赖注入直接塞给控制器用。
搁以前写Express,文件之间互相导入,A引B,B引C,改个路径半片文件全爆红。
现在有了依赖注入,你需要什么服务,直接声明就行,容器自动给你送过来,省心多了。
3.4 三者到底是什么关系
一句话总结:模块管着控制器和服务,控制器收请求,服务干脏活累活,靠依赖注入串起来。
就像一个部门里,部门经理管着前台和办事员,前台接客户,办事员处理业务,各司其职,不乱套。
4 别手动建文件了,CLI一键生成不香吗
我见过不少新手,加个功能就自己新建文件,写完还得去模块里注册,经常漏这漏那,跑起来报错找半天。
听我的,但凡加新功能,直接用CLI生成,又快又规范。
# 生成用户模块nest g moduleusers# 生成用户控制器nest g controllerusers# 生成用户服务nest gserviceusers# 一键生成完整CRUD(模块+控制器+服务全齐)nest g resource products命令一敲,文件自动建,依赖自动注册,连测试文件都给你备好。
省下来的时间摸鱼不好吗,非要跟自己较劲手动写。
5 管道:数据进来的第一道安检门
管道这东西,说穿了就是两个作用:验证数据,转换格式。
就像地铁站的安检,违禁品直接拦下来,行李尺寸不对的给你调整一下,合格了才能进去。
5.1 管道+DTO的标准三步走
最常用的玩法,就是配合DTO做参数校验。
第一步,先装依赖:
npminstallclass-validator class-transformer第二步,写DTO类,给每个字段贴好校验规则。
什么不能为空、邮箱格式、年龄下限,全写在里面,还能自定义错误提示。
第三步,控制器里直接用,参数进来自动校验,不合格直接返回错误,根本进不了业务逻辑。
5.2 全局开启,一劳永逸
嫌每个接口都加太麻烦?直接在入口文件开全局管道。
配上自动类型转换、自动剔除多余字段、遇到非法字段直接报错,所有接口自动生效。
尤其是做AI应用,这玩意儿简直是省钱神器。
你想啊,要是没校验,空消息、乱码、超长文本全往大模型发,一天下来API额度烧没了,账单出来心都在滴血。
管道往这一放,不合格的请求全拦在外面,省下来的都是真金白银。
6 请求链路上的四道关卡,别再搞混了
很多人学NestJS,最头疼的就是中间件、守卫、拦截器、管道这四个东西。
执行顺序记不住,各自干啥的分不清,面试一问直接卡壳。
6.1 执行顺序先记死
先把顺序背下来,后面理解起来就快了:
请求进来 → 中间件 → 守卫 → 拦截器前置 → 管道 → 控制器 → 服务 → 拦截器后置 → 返回响应
就像你去政府办事,先过门口保安,再查身份证,再领号填表,然后窗口办事,最后拿单子走人。
6.2 中间件:最早的门卫大爷
中间件是最先接触到请求的。
记日志、配CORS、解析原始请求体,这些粗活都是它干。
就像小区门口的大爷,你刚进小区,他先瞅你一眼,记下来你几点进来的,别的不管。
6.3 守卫:查权限的安检员
守卫管的是权限。
你有没有登录、有没有API Key、有没有资格访问这个接口,都是它说了算。
没权限?直接给你拦在外面,连业务逻辑的边都碰不着。
就像地铁安检,没票或者带了违禁品,直接不让你进。
6.4 拦截器:给结果打包的包装员
拦截器是前后都能管。
请求进来的时候,可以改改请求数据;业务处理完了,可以给返回结果统一包个格式、记个耗时、做个缓存。
就像快递站,你寄的东西过来,给你套个盒子贴个快递单,整整齐齐再发出去。
6.5 一张表给你捋明白
| 特性 | 中间件 | 守卫 | 管道 | 拦截器 |
|---|---|---|---|---|
| 执行顺序 | 第一个 | 第二个 | 第四个 | 第三个,全程包裹 |
| 核心职责 | 原始请求处理 | 权限身份校验 | 数据验证转换 | 响应映射缓存 |
| 能不能碰DTO | 不行,只能拿原始数据 | 不行,一般只看请求头 | 专门管DTO | 能拿到最终结果 |
| 常用装饰器 | configure注册 | @UseGuards() | @UsePipes() | @UseInterceptors() |
对着表多看两遍,再也不会搞混了。
7 NestJS里的MVC,到底是怎么落地的
NestJS虽然不是严格的经典MVC,但分层的思路是一模一样的。
说白了就是各干各的,别啥都往一块堆。
| 层级 | 干啥活 |
|---|---|
| Controller层 | 收请求、转路由、返回结果 |
| Service层 | 写业务逻辑、调外部接口、编排流程 |
| DTO/Entity层 | 定义数据结构、写校验规则 |
| Repository层 | 数据库增删改查,ORM来搞定 |
从上到下一层层调用,谁也不越界。以后改需求,找对应的层改就行,不会牵一发动全身。
别再把所有逻辑全写控制器里了,一时省事,后期全是债。
8 模块不是只能一配一,别把自己框死
很多新手有个误区:一个模块必须配一个控制器一个服务。
哪有这么死板的规定。
一个模块里可以放好多个控制器、好多个服务,怎么合理怎么来。
一个控制器也可以注入好多个服务,需要啥功能就用啥。
甚至有的模块根本不需要控制器,就纯提供工具服务,导出给别的模块用就行。
比如做AI功能,一个AI模块里可以放聊天控制器、文档控制器,再配LangChain服务、向量服务、Prompt服务。
按功能领域划分模块,而不是死磕一一对应,代码结构才会清爽。
9 接上LangChain,给你的后端装上AI大脑
前面的基础打牢了,现在就可以接入AI能力了。
搭配LangChain,不用自己吭哧吭哧封装大模型接口,直接就能用。
9.1 先把依赖装了
npminstallnestjs-langchain langchain @langchain/openai9.2 注册LangChain模块
在根模块里注册一下,配好大模型的配置和系统提示词。
跟注册其他模块一模一样,没什么额外的学习成本。
9.3 在服务里直接调用AI
注入LangChainService,直接调用run方法就能发请求。
想做RAG带上下文问答?自己拼好Prompt传进去就行,简单得很。
9.4 最绝的玩法:把服务方法变成AI工具
这是我觉得最惊艳的功能。
给你的服务方法加个@Tool()装饰器,写好描述,这个方法就变成AI可以自动调用的工具了。
比如你写个加法方法、写个查天气的方法,注册进去之后,用户问相关的问题,AI会自己判断要不要调用这个工具。
相当于给AI配了个工具箱,需要什么自己拿,不用你写一堆if else判断。
10 做AI应用的几个实战建议
最后给大家几个实用建议,都是踩坑踩出来的经验。
第一,接口一定要加保护。API Key校验加上,限流加上,不然被人恶意刷接口,账单分分钟爆炸。
第二,用户输入一定要校验。问题长度、参数范围,都给限制好,别啥乱七八糟的都往大模型发,烧的都是钱。
第三,返回格式统一一下。所有接口都用一样的结构,前端对接也舒服,后期加字段也好加。
第四,分层一定要清晰。控制器只管路由,服务写业务,数据层管持久化,别混在一起。不然后期加功能、改bug,有你头疼的。
11 最后唠两句
其实NestJS没大家想的那么难,核心就是一套规范的架构思路。
把模块、控制器、服务这三个核心搞懂,把请求链路的顺序理清楚,剩下的都是边用边学的东西。
再结合LangChain,你就能搭出结构清晰、好维护的AI应用了。
想进阶的话,可以再深入研究LangChain的Chain、Agent、向量数据库,做做RAG实战,搞搞流式输出,再补补单元测试。
技术这东西,基础打牢了,往上搭东西都快。
祝大家写代码少出bug,AI账单月月省钱。
P.S. 目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。