细说Nest系列之Nest初认识

398 阅读7分钟

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 文件是测试文件的命名约定,包含测试用例的文件。理解这一点对编写单元测试非常重要。