Skip to content

手动安装

✍️ w 🕒 2024-06-17 14:53:00(5 days ago) 🔗 B.NodeJS学习 服务端 nestjs

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

在底层,Nest使用强大的 HTTP Server 框架,如 Express(默认)和 Fastify。Nest 在这些框架之上提供了一定程度的抽象,同时也将其 API 直接暴露给开发人员。这样可以轻松使用每个平台的无数第三方模块。

Nest 的依赖包

  • @nestjs/core Nest.js核心模块,提供构建、启动和管理Nest.js应用程序的基础设施
  • @nestjs/common 包含了构建Nest.js应用程序基础设施和常用装饰器,像控制器、服务、中间件、守卫、拦截器、管道、异常过滤器等
  • rxjs 用于构建异步和事件驱动程序的库, 基于可观察序列的概念,提供强大的功能来处理异步数据流。
  • reflect-metadata 实现元编程的库,提供元数据反射API,可以在运行时检查和操作对象的元数据
  • @nestjs/platform-express Nest的Express平台适配器,提供中间件、路由等功能

其他

  • ts-node 是一个用于直接执行 TypeScript 代码的 Node.js 实现,它允许开发者在不预先编译的情况下运行 TypeScript 文件

安装

bash
pnpm install @nestjs/core @nestjs/common rxjs reflect-metadata @nestjs/platform-express

pnpm install -g ts-node

简单demo

ts
import { NestFactory } from '@nestjs/core';
import { Module, Injectable, Controller, Get } from '@nestjs/common';

// 服务 @Injectable 装饰器标记 AppService 类为可注入服务
@Injectable()
class AppService {
  getHello(): string {
    return 'Hello World!';
  }
}

// 控制器 @Controller 装饰器标记 AppController 类为控制器。
@Controller()
class AppController {
  constructor(private readonly appService: AppService) {}
  // @Get 装饰器标记 getHello 方法为处理 GET 请求的路由。
  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}

// 模块 @Module 装饰器配置模块的控制器和提供者。
@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
class AppModule {}

// 创建和启动应用
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
	// 通过 app.listen 启动应用监听 3000 端口,并输出应用运行信息
  await app.listen(3000);
  console.log('Application is running on: http://localhost:3000');
}
bootstrap();

项目结构目录划分开发

bash
.
|-- package.json
|-- pnpm-lock.yaml
|-- src
|   |-- app.controller.ts
|   |-- app.module.ts
|   `-- main.ts
`-- tsconfig.json

执行 ts-node src/main.ts 运行项目访问 http://127.0.0.1:3000/a/b 就可以看到页面输出 Hello World! ,启动项目后在控制台 会输入日志

[Nest] 22276  - 2024/06/17 13:20:29     LOG [NestFactory] Starting Nest application...
[Nest] 22276  - 2024/06/17 13:20:29     LOG [InstanceLoader] AppModule dependencies initialized +13ms
[Nest] 22276  - 2024/06/17 13:20:29     LOG [RoutesResolver] AppController {/a}: +8ms
[Nest] 22276  - 2024/06/17 13:20:29     LOG [RouterExplorer] Mapped {/a/b, GET} route +3ms
[Nest] 22276  - 2024/06/17 13:20:29     LOG [NestApplication] Nest application successfully started +3ms

关于日志的说明

时间戳进程ID日志级别组件日志信息耗时作用
2024/06/17 13:20:2922276LOG[NestFactory]Starting Nest application...启动 Nest 应用程序。
2024/06/17 13:20:2922276LOG[InstanceLoader]AppModule dependencies initialized+13ms初始化 AppModule 的依赖项。
2024/06/17 13:20:2922276LOG[RoutesResolver]AppController {/a}:+8ms解析AppController中的路由路径/a
2024/06/17 13:20:2922276LOG[RouterExplorer]Mapped {/a/b, GET} route+3ms映射 GET 路由 /a/b
2024/06/17 13:20:2922276LOG[NestApplication]Nest application successfully started+3msNest 应用程序成功启动。

src\main.ts

NestFactory 是 NestJS 框架中用于创建 Nest 应用实例的核心类。它提供了一组静态方法,用于引导和启动应用程序。

NestFactory.create创建一个 Nest 应用实例,默认使用 Express 作为底层 HTTP 服务器。

ts
// 导入 NestFactory 模块,它用于创建Nest 应用实例
import { NestFactory } from "@nestjs/core";

// 导入跟模块
import { AppModule } from "./app.module";

// 定义一个异步函数,用于创建并且启动 Nest 应用
async function bootstrap() {
  // 使用 NestFactory 创建一个 Nest 应用实例 并传入根模块 AppModule
  // 在底层,NestFactory.create() 方法使用了一个内部的 HTTP 服务器(Express 或 Fastify)来处理传入的请求
  const app = await NestFactory.create(AppModule);
  // NestFactory 它提供了一些静态方法来建立和配置整个应用程序
  // // 设置全局路由前缀
  // app.setGlobalPrefix("api");

  // // 启用 CORS
  // app.enableCors();

  // 使用 app.listen 方法监听 3000 端口
  await app.listen(3000);
}

bootstrap();

app.module.ts

@Module 是 NestJS 框架中的一个装饰器,用于定义模块。模块是组织代码的基本单元,它们将相关的组件(如控制器、服务、提供者等)组合在一起。NestJS 的模块系统受到了 Angular 的启发,旨在促进代码的模块化和可维护性。

ts
// controller 用来处理请求
import { AppController } from "./app.controller";

import { Module } from "@nestjs/common";

// nest 创建一个新的模块。这个模块是一个类,用 @Module 装饰器装饰
/**
 * @Module是一个装饰器,用于定义模块
 * 模块是组织代码的基本单元,它将相关的组件(控制器、服务器、提供者)组合在一起
 * Nest的模块系统是受Angular启动
 */
@Module({
  controllers: [AppController],
})
export class AppModule {}

app.controller.ts

@Controller 是 NestJS 框架中的一个装饰器,用于定义控制器。控制器是处理传入 HTTP 请求的核心组件。每个控制器负责处理特定的请求路径和相应的 HTTP 方法。控制器使用路由装饰器(如 @Get@Post 等)来定义路由和请求处理方法。

@GetNestJS 框架中的一个装饰器,用于将控制器方法映射到 HTTP GET 请求。这个装饰器是由 @nestjs/common 模块提供的。通过使用 @Get 装饰器,可以指定该方法处理特定路径上的 GET 请求。

ts
import { Controller, Get } from "@nestjs/common";

// 定义一个控制器类,用于处理请求
/**
 * @Controller也是一个装饰器,用于定义控制器
 * 控制器是处理传入HTTP请求的核心组件,每个控制器负责处理特定的请求路径和对应的HTTP方法
 * 在控制器的内部会使用路由装饰 器如@Get @Post来定义路径和请求处理方法
 *
 * @Get也是一个路由装饰器,用于将控制器的方法(getHello)映射到HTTP的GET请求
 * 当客户端使用GET方法访问 路径/a/b   ['a','b']
 * 通过@Get装饰器,可以指定该方法处理特定路径上的GET请求
 */
@Controller("/a")
export class AppController {
  @Get("/b")
  getHello(): string {
    return "Hello World!";
  }
}

tsconfig.json

json
{
  // 编译选项
  "compilerOptions": {
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true, // 启用实验性的装饰器特性
    "target": "ESNext", // 编译后的目标版本
    "moduleResolution": "NodeNext", // 模块解析策略
    "module": "NodeNext" // 模块化方案
  }
}

compilerOptions 是 TypeScript 的配置文件 tsconfig.json 中用于指定编译选项的顶层字段。

  1. emitDecoratorMetadata

    • 含义:当该选项设置为 true 时,TypeScript 编译器会在编译时生成有关装饰器(decorators)使用的元数据。这对于依赖于反射(reflection)机制的应用程序非常有用。
    • 默认值false
  2. experimentalDecorators

    • 含义:启用实验性的装饰器特性。装饰器是一个用于装饰类及其成员的特殊语法,目前还处于实验阶段。
    • 默认值false
    • 注意:由于这是一个实验性特性,可能在未来的版本中发生变化。
  3. target

    • 含义:设置编译后的目标 JavaScript 版本。这决定了生成的 JavaScript 代码的语言级别。
    • 值示例"ES5", "ES6", "ESNext"
    • 此处设置"ESNext" 表示编译后的代码将使用最新的 ECMAScript 标准。
  4. moduleResolution

    • 含义:决定 TypeScript 如何查找模块文件。在大多数情况下,这决定了文件之间的导入路径解析策略。
    • 值示例"Classic", "Node"
    • 此处设置"NodeNext" 表示使用 Node.js 的下一代模块解析方式。
  5. module

    • 含义:指定要使用的模块系统,有助于决定如何生成和解释模块化的代码。
    • 值示例"CommonJS", "ES6", "AMD", "UMD", "System"
    • 此处设置"NodeNext" 表示使用 Node.js 的下一代模块化方案。

总结:

  • emitDecoratorMetadataexperimentalDecorators 是与装饰器相关的配置,用于启用和生成装饰器的元数据。
  • target 设定了编译后的 JavaScript 版本,以确保兼容性。
  • moduleResolutionmodule 决定了如何处理模块和模块化的代码,这些设置视具体的运行环境(如 Node.js)而定。

Released under the MIT License.