Appearance
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:29 | 22276 | LOG | [NestFactory] | Starting Nest application... | 启动 Nest 应用程序。 | |
2024/06/17 13:20:29 | 22276 | LOG | [InstanceLoader] | AppModule dependencies initialized | +13ms | 初始化 AppModule 的依赖项。 |
2024/06/17 13:20:29 | 22276 | LOG | [RoutesResolver] | AppController {/a}: | +8ms | 解析AppController 中的路由路径/a 。 |
2024/06/17 13:20:29 | 22276 | LOG | [RouterExplorer] | Mapped {/a/b, GET} route | +3ms | 映射 GET 路由 /a/b 。 |
2024/06/17 13:20:29 | 22276 | LOG | [NestApplication] | Nest application successfully started | +3ms | Nest 应用程序成功启动。 |
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
等)来定义路由和请求处理方法。
@Get
是 NestJS
框架中的一个装饰器,用于将控制器方法映射到 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
中用于指定编译选项的顶层字段。
emitDecoratorMetadata
- 含义:当该选项设置为
true
时,TypeScript 编译器会在编译时生成有关装饰器(decorators)使用的元数据。这对于依赖于反射(reflection)机制的应用程序非常有用。 - 默认值:
false
- 含义:当该选项设置为
experimentalDecorators
- 含义:启用实验性的装饰器特性。装饰器是一个用于装饰类及其成员的特殊语法,目前还处于实验阶段。
- 默认值:
false
- 注意:由于这是一个实验性特性,可能在未来的版本中发生变化。
target
- 含义:设置编译后的目标 JavaScript 版本。这决定了生成的 JavaScript 代码的语言级别。
- 值示例:
"ES5"
,"ES6"
,"ESNext"
等 - 此处设置:
"ESNext"
表示编译后的代码将使用最新的 ECMAScript 标准。
moduleResolution
- 含义:决定 TypeScript 如何查找模块文件。在大多数情况下,这决定了文件之间的导入路径解析策略。
- 值示例:
"Classic"
,"Node"
- 此处设置:
"NodeNext"
表示使用 Node.js 的下一代模块解析方式。
module
- 含义:指定要使用的模块系统,有助于决定如何生成和解释模块化的代码。
- 值示例:
"CommonJS"
,"ES6"
,"AMD"
,"UMD"
,"System"
- 此处设置:
"NodeNext"
表示使用 Node.js 的下一代模块化方案。
总结:
emitDecoratorMetadata
和experimentalDecorators
是与装饰器相关的配置,用于启用和生成装饰器的元数据。target
设定了编译后的 JavaScript 版本,以确保兼容性。moduleResolution
和module
决定了如何处理模块和模块化的代码,这些设置视具体的运行环境(如 Node.js)而定。