Skip to content

Nest 介绍

Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用的框架。它使用渐进式 JavaScript,构建并完全支持 TypeScript(但仍然允许开发者使用纯 JavaScript 进行编码)并结合了 OOP(面向对象编程)、FP(函数式编程)和 FRP(函数式反应式编程)的元素。

在幕后,Nest 使用强大的 HTTP 服务器框架,如 Express(默认),也可以选择配置为使用 Fastify

Nest 在这些常见的 Node.js 框架(Express/Fastify)之上提供了一个抽象级别,但也直接向开发者公开了它们的 API。这使开发者可以自由使用可用于底层平台的无数第三方模块。

安装

要开始 你可以使用Nest命令行接口构建项目,或者克隆一个启动项目

要使用 Nest CLI 构建项目,请运行以下命令。这将创建一个新的项目目录,并使用初始核心 Nest 文件和支持模块填充该目录,为你的项目创建一个常规的基础结构。建议首次使用的用户使用 Nest CLI 创建新项目。我们将在 第一步 中继续使用这种方法。

bash

npm i -g @nestjs/cli

nest new project-name

警告

要创建具有更严格功能集的新 TypeScript 项目,请将 --strict 标志传递给 nest new 命令。

备选方案

或者使用 git 安装 ts 入门项目

bash

$ git clone https://github.com/nestjs/typescript-starter.git project
$ cd project
$ npm install
$ npm run start

打开浏览器并导航至 http://localhost:3000/。你应该会看到 "Hello World!" 消息。

`

文件目录

ts
.
├── README.md // 说明文件
├── dist // 打包生成的文件
│   ├── app.controller.d.ts
│   ├── app.controller.js
│   ├── app.controller.js.map
│   ├── app.module.d.ts
│   ├── app.module.js
│   ├── app.module.js.map
│   ├── app.service.d.ts
│   ├── app.service.js
│   ├── app.service.js.map
│   ├── common
│   ├── main.d.ts
│   ├── main.js
│   ├── main.js.map
│   ├── modules
│   └── tsconfig.build.tsbuildinfo
├── nest-cli.json // nestjs配置文件
├── package.json // npm 包文件
├── src // 开发源码文件
│   ├── app.controller.spec.ts
│   ├── app.controller.ts // 控制器路由
│   ├── app.module.ts // 模块文件
│   ├── app.service.ts // 服务文件
│   └── main.ts // 入口主文件
├── tsconfig.build.json
├── tsconfig.json
└── yarn.lock

启动 nest 服务

ts
yarn start:dev

or

npm run start:dev


[10:01:56 PM] Starting compilation in watch mode...

[10:01:58 PM] Found 0 errors. Watching for file changes.

[Nest] 36861   - 010/31/2024, 10:01:59 PM   [NestFactory] Starting Nest application...
[Nest] 36861   - 010/31/2024, 10:01:59 PM   [InstanceLoader] AppModule dependencies initialized +15ms
[Nest] 36861   - 010/31/2024, 10:01:59 PM   [RoutesResolver] AppController {}: +8ms
[Nest] 36861   - 010/31/2024, 10:01:59 PM   [RouterExplorer] Mapped {, GET} route +3ms
[Nest] 36861   - 010/31/2024, 10:01:59 PM   [NestApplication] Nest application successfully started +2ms

默认启动的地址是http://127.0.0.1:3000页面上会显示hello world

nest 中基础概念

nest 控制器

什么是控制器?

控制器负责处理传入的请求和向客户端返回响应

控制器的目的是接收应用的特定请求.路由机制控制那个控制器接收哪些请求

通常每个控制器有多个路由,不同的路由可以执行不同的操作

为了创建一个基本的控制器,我们使用装饰器装饰器将类与所需的元数据进项关联起来

并且使Nest能够创建路由映射(将请求绑定到响应的控制器)

nest 服务

服务可以是 service 也可以是 provider,都可以通过 constructor 注入依赖关系。

服务本质上是一个@Injectable()装饰器注解的类,相当于 mvc 中的 model

nest 模块

模块是具有 @Module() 装饰器的类。 @Module() 装饰器提供了元数据,Nest 用它来组织应用程序结构,每个 Nest 应用程序至少有一个模块,即根模块。

根模块是 Nest 开始安排应用程序树的地方。 事实上,根模块可能是应用程序中唯一的模块,特别是当应用程序很小时,但是对于大型程序来说这是没有意义的。

在大多数情况下,您将拥有多个模块,每个模块都有一组紧密相关的功能

注意

@module() 装饰器接受一个描述模块属性的对象

  • providers - 由 Nest 注入器实例化的提供者,并且可以注入到依赖它们的类中.并且可以至少在整个模块中共享

  • controllers - 必须由 Nest 创建和实例化的控制器。这些控制器必须具有路由,以便客户端可以访问它们

  • imports - 导入的模块,这些模块的提供者可用于当前模块中的导入绑定

  • exports - 导出的提供者,这些提供者可用于导入当前模块的模块

每一个模块都是一个共享模块,一旦创建就能被任意模块重复使用

Nest 架构和代码组合方式

nest 的代码就是以模块化的方式组合的,每一块的功能都可以定义成一个模块,先从程序的入口文件main.ts入手

ts
import { NestFactory } from "@nestjs/core";
import { AppModule } from "./app.module";

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
bootstrap();

通过代码可以看出,通过NestFactory来创建一个应用示例,实例中基于 AppModule 模块,并且监听 3000 端口

在看看这个模块是什么

ts
import { Module } from "@nestjs/common";
import { AppController } from "./app.controller";
import { AppService } from "./app.service";

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

AppModule 类通过@Module 装饰器变成一个模块,整个应用就是这样的一个一个的模块组成

然后一个模块由一个个的服务和控制组成,nest 的代码基础组成方式就是这样的.在看下控制器和服务

  • 控制器
ts
import { Controller, Get } from "@nestjs/common";
import { AppService } from "./app.service";

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}
  • 服务
ts
import { Injectable } from "@nestjs/common";

@Injectable()
export class AppService {
  getHello(): string {
    return "Hello World!";
  }
}