1. 前言
上篇以账房为例解释了后端的本质,现在进入到代码部分,看看如何使用 NestJS 创建一个项目。
先来看个小故事,从感性角度继续理解流程:
有一天,邢捕头来同福客栈吃饭,看了看菜单,想要点个鱼香肉丝。佟掌柜就去安排下去了,白展堂把消息告诉了李大嘴,大嘴看了看食材库存还够,就开始忙活了,这边刀功飞快,又是热锅冷油……只听呲啦呲啦,片刻之间,白展堂就把菜端了上来,这往桌上一摆,邢捕头拿起筷子就大口吃了起来。顷间,吕秀才已经做好了账面记录,随后撕了一张票据给老邢。
记住这个故事,往下看:
- 同福客栈的菜单就是各路由
- 鱼香肉丝就是某一个路由
- 当邢捕头点了鱼香肉丝就是发送了一个 HTTP 请求
- 佟掌柜的安排(自然知道要去找谁:让老白去厨房找大嘴)就是 Controller(控制器,接收和处理请求)
- 真正懂炒菜业务的是大嘴,炒菜业务本身就是 Service(业务逻辑层),检查食材库存实际上就在和数据库交互
- 餐桌上有地方放筷子、有地方放醋碟,邢捕头低头的位置就是放碗的,这就是 View(视图模版)
- 炒完菜,邢捕头看到碗里的鱼香肉丝,(本来碗里没有鱼香肉丝到有鱼香肉丝)就是浏览器渲染页面,把请求的数据渲染了出来
如果从 B端、C端角度:
- 佟掌柜拿出菜单给老邢,老邢点菜(C 端)
- 炒菜当然要检查食材库存,所以对于大嘴来说厨房的库存就是一本账本(B 端)
- 炒完了端出来,秀才就知道这单成了,成交记录 +1(B 端)
- 邢捕头高高兴兴拿着票据回衙门报销(C 端)
欢迎加入技术交流群。
- NestJS 🧑🍳 厨子必修课(一):后端的本质
- NestJS 🧑🍳 厨子必修课(二):项目创建
- NestJS 🧑🍳 厨子必修课(三):控制器
- NestJS 🧑🍳 厨子必修课(四):服务类
- NestJS 🧑🍳 厨子必修课(五):Prisma 集成(上)
- NestJS 🧑🍳 厨子必修课(六):Prisma 集成(下)
- NestJS 🧑🍳 厨子必修课(七):管道
- NestJS 🧑🍳 厨子必修课(八):异常过滤器
2. 创建项目
现在使用 Nest 创建一个项目。
2.1 安装
$ npm i -g @nestjs/cli
2.2 初始化项目
# $ nest new [name]
$ nest new cook-api-1
cook-api-1 就是这个 Nest 项目的名字,随便起。
2.3 启动项目
$ cd cook-api-1
$ npm install
$ npm run start:dev
访问 http://localhost:3000/ 可以看到 Hello World! 的画面。
2.4 打包构建
$ npm run build
运行以上命令即可完成项目打包构建,并在项目目录下生成一个 dist 目录。
2.5 运行生产环境代码
有了 dist 产物,执行以下命令即可运行打包后的项目,这也是上线后的运行效果。
$ npm run start:prod
⚠️ 注意:在 package.json 中的这条脚本命令是:"start:prod": "node dist/main"
,这表示说运行的入口文件是 dist 下的 main.js,如果是接入 prisma 等 ORM 工具,打包后的目录结构有所不同,这里是需要修改的。
3. 约定大于配置
Nest 提供了一种“约定大于配置”的架构形式,它的意义在于减少配置,让开发者在规定区域编写代码,减轻开发压力和心智负担。
在 src 目录下有以下文件:
- .controller.ts:处理 http 请求以及调用 service 层方法
- .service.ts:封装通用的业务逻辑、与数据层交互(数据库 CRUD 操作)、其他额外的第三方请求
- .module.ts:模块,注入控制器和服务
继续往下看可以发现每一组资源都对应了这三种文件,它们各自约好了在其中应该写什么内容,而不是自己去配置、去封装。就好像感冒了不会去吃咳嗽药一样。
4. 总结
这篇博客以武林外传的故事串联起整个业务流程,另外还介绍了如何使用 NestJS 去创建和构建并运行一个项目,以及 NestJS 中的 src 文件构成。