1. 什么是Nest
1.1.1 Nest概述
NestJS 是一个基于 Node.js 和 TypeScript 的框架,用于构建高效、可靠、可扩展的服务器端应用程序和 CLI 应用程序。它结合了许多流行的 Node.js 插件,提供了一个结构化的框架,帮助开发人员更好地组织和扩展应用程序。
1.1.2 为什么需要 NestJS?
虽然 Node.js 提供了灵活性,但当团队规模扩大时,这种灵活性可能变成一个问题。开发人员需要决定如何模块化应用程序、管理依赖关系和确保可扩展性。NestJS 通过提供统一的结构和框架,帮助开发团队维持一致性和可扩展性。它让开发人员专注于业务逻辑而非应用程序结构的繁琐配置。
1.1.3 Nest有哪些功能?
NestJS 提供了一些关键功能来帮助开发者构建可扩展、可维护且可测试的应用程序:
-
内置路由功能:处理请求和响应。
-
中间件支持:可以拦截和修改传入的请求。
-
异常处理:内置的异常处理机制。
-
测试功能:支持单元测试和端到端测试,兼容 Jest 和 Supertest。
-
文档生成:通过装饰器生成 API 文档,支持与 Swagger 等工具集成。
1.1.3 NestJS 可以用于哪些应用场景?
NestJS 不仅适用于 REST API,还可以用于多种应用程序,如:
-
微服务:支持微服务架构。
-
WebSocket:实现实时通信。
-
GraphQL:构建 GraphQL API。
-
MVC 应用程序:传统的 MVC 架构。
-
CLI 应用程序:构建命令行工具。
2. NestCli 的使用
你作为一名前端开发工程师,CLI 这个应该都懂的。在前端项目里面用到的 Vue cli
一样的作用。用于项目快速搭建、编译、构建、测试等功能。Nest也不例外,也会有这个CLI,可以提高开发效率
2.1.1 NestCLI的安装
npm i @Nestjs/cli -g
安装完成后,执行 nest -h
得到下面这样,证明安装成功
命令讲解
nest new
创建新的应用
nest build
构建生成应用
nest start
启动开发服务
nest info
查看Nest包信息
nest add
添加插件或者第三方模块
2.1.2 创建项目
nest new app_name
回车执行
选择哪个包依赖,推荐使用 yarn
⚡ We will scaffold your app in a few seconds..? Which package manager would you ❤️ to use? (Use arrow keys)❯ npm yarn pnpm
直到见到这个,才算完成
🚀 Successfully created project demo👉 Get started with the following commands:$ cd demo$ yarn run start Thanks for installing Nest 🙏
Please consider donating to our open collective
to help us maintain this package.
🍷 Donate: https://opencollective.com/nest
需要注意,这个命令也有参数选择
输入 nest new -h
查看命令参数
Usage: nest new|n [options] [name]Generate Nest application.Options:
--directory [directory] Specify the destination directory -d, --dry-run Report actions that would be performed without writing out results. (default: false) -g, --skip-git Skip git repository initialization. (default: false) -s, --skip-install Skip package installation. (default: false) -p, --package-manager [packageManager] Specify package manager. -l, --language [language] Programming language to be used (TypeScript or JavaScript) (default: "TypeScript") -c, --collection [collectionName] Schematics collection to use (default: "@nestjs/schematics") --strict Enables strict mode in TypeScript. (default: false) -h, --help Output usage information.
--directory [directory]
:指定目标目录-d, --dry-run
:报告将要执行的操作,但不输出结果。(默认:false)-g, --skip-git
:跳过 Git 仓库初始化。(默认:false)-s, --skip-install
:跳过包安装。(默认:false)-p, --package-manager [packageManager]
:指定包管理器-l, --language [language]
:使用的编程语言(TypeScript 或 JavaScript)(默认:"TypeScript")-c, --collection [collectionName]
:要使用的方案集合(默认:"@nestjs/schematics")--strict
:启用 TypeScript 严格模式。(默认:false)-h, --help
:输出使用信息
项目创建完毕后,可以通过 cd demo
, 用命令 npm run start:dev
以开发模式启动项目
2.1.3 创建代码片段
可以通过命令创建代码片段,无需编写模板代码,快速开发。
常用的创建代码片段的命令。
- application (alias: application) - 生成一个新的应用工作空间
- class (alias: cl) - 生成一个新的类
- configuration (alias: config) - 生成一个CLI配置文件
- controller (alias: co) - 生成一个控制器声明
- decorator (alias: d) - 生成一个自定义装饰器
- filter (alias: f) - 生成一个过滤器声明
- gateway (alias: ga) - 生成一个网关声明
- guard (alias: gu) - 生成一个守卫声明
- interceptor (alias: itc) - 生成一个拦截器声明
- interface (alias: itf) - 生成一个接口声明
- library (alias: lib) - 在单体仓库中生成一个新的库
- middleware (alias: mi) - 生成一个中间件声明
- module (alias: mo) - 生成一个模块声明
- pipe (alias: pi) - 生成一个管道声明
- provider (alias: pr) - 生成一个提供者声明
- resolver (alias: r) - 生成一个GraphQL解析器声明
- resource (alias: res) - 生成一个新的CRUD资源
- service (alias: s) - 生成一个服务声明
- sub-app (alias: app) - 在单体仓库中生成一个新的应用
有几个参数,需要了解下
.spec.ts
是单元测试文件,如果不需要,生成测试文件。可以通过--no-space
--flat
和--not-flat
分别是使用扁平化结构 和 不使用扁平化结构
注意看,目录结构
nest g controller auth --flatCREATE auth.controller.spec.ts (478 bytes)CREATE auth.controller.ts (97 bytes)
nest g controller auth --no-flatCREATE auth/auth.controller.spec.ts (478bytes)CREATE auth/auth.controller.ts (97 bytes)
-
--skip-import
表示跳过自动导入依赖 默认是自动导入
比如我现在创建一个控制器可以通过以下命令
nest g controller user
或者
nest g co user
看到下面的输出,则是成功创建
CREATE user/user.controller.ts (97 bytes)
CREATE user/user.controller.spec.ts (478 bytes)
2.1.4 启动开发模式
npm run start:dev
就可以愉快开发了。
3.main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule); // 创建app服务
await app.listen(8000); // 端口号 8000
}
bootstrap();
Nest.js 引导过程:
-
main.ts
文件是 Nest.js 应用程序的引导文件。 -
在
main.ts
中,使用NestFactory
创建应用程序实例,并导入应用程序模块(AppModule
)。 -
创建的应用程序通过
create()
方法启动,并监听默认的端口 3000。
启动开发模式:
-
通过命令
npm run start:dev
启动开发服务器。 -
如果更改端口号(如改为 3300),应用会重新启动并监听新端口。
修改端口:
-
可以修改
main.ts
文件中的端口配置,改变 Nest.js 应用程序监听的端口。 -
修改后,服务器会重新启动,并且新的端口设置会生效。
应用程序对象:
- 在引导过程中,可以使用
console.log
打印应用程序对象,这个对象包含了关于 Nest.js 内部模块的信息,帮助理解应用程序的结构和依赖注入机制。
模块结构:
-
main.ts
依赖AppModule
来构建整个应用程序。 -
每个其他模块都需要在
AppModule
中注册,以便被正确加载。
4.了解App模块
应用模块(AppModule):
-
app.module.ts
是 Nest.js 应用程序的主模块文件,负责引导整个应用。 -
Nest.js 中的每个模块都需要导入到
app.module.ts
中,以便 Nest.js 能够识别并加载它们。 -
@Module
装饰器标记文件为模块入口点,模块文件的命名遵循一定约定(例如:app.module.ts
),但这与文件是否作为主模块入口点无关。
文件命名约定:
-
Nest.js 使用命名约定帮助开发者识别不同类型的文件,例如:
controller.ts
为控制器文件,service.ts
为服务文件,spec.ts
为测试文件(包含测试用例)。 -
这些命名约定有助于代码组织,但并不决定文件的功能,真正的功能是通过装饰器(如
@Controller
、@Service
)来定义的。
应用模块的目录结构:
-
默认情况下,所有文件直接位于
src
目录下,但你可以创建新的目录(如app
),将相关文件移动到这些目录中。 -
修改目录后,必须更新导入路径,以便正确引用文件。例如,若将文件移入
app
目录,app.module.ts
的导入路径需要更新。
控制器与服务:
-
app.controller.ts
控制器负责处理路由逻辑,在这个例子中返回 "hello world" 消息。 -
app.service.ts
服务文件定义了返回消息的逻辑。 -
你可以更改服务中的返回内容,例如将 "hello world" 改为 "hello",并在浏览器中查看结果。
测试文件:
-
controller.spec.ts
文件用于编写控制器的测试用例。 -
spec.ts
文件是测试文件的命名约定,包含测试用例的文件。理解这一点对编写单元测试非常重要。