阅读 NestJS 中文文档 和神光的 Nest 通关秘籍后的学习收获。
必要条件:Node 版本 >= 16
安装
方式一:利用 npx 的方式
npx @nestjs/cli new 项目名
方式二:全局安装(推荐)
为什么推荐呢?因为在后续的 Nest 项目开发过程中,提供了大量的指令可以加快我们的开发速度。
npm i -g @nestjs/cli
nest new project-name
唯一有个缺点,就是当版本更新时,需要手动去更新脚手架
npm update -g @nestjs/cli
指令
@nestjs/cli
提供了大量的 nest 指令。
到底提供了哪些指令呢?通过 nest -h
或者 nest --help
即可查看所有的指令。
在上面的图中,可以很清晰看出 nest 指令的基本格式,nest 的指令选项,nest 的指令别名和描述等等一系列。
在前期学习的时候,可以仔细的研究一下每个指令的含义,加深自己的理解,但是不需要死记硬背。在后期的开发中,当忘记的时候,只需要输入
nest -h
帮你回忆即可。
就对于我自己而言,现阶段不是使用指令创建项目,就是使用指令开创建代码片段。
nest new
projectNamenest g
xxx (g 是 generate 的别名,译为生成)
入口文件分析
当使用 nest new 创建一个新项目,就会产生下面的目录结构。
src -
app.controller.ts - // 基本控制器
app.module.ts - // 根模块
app.service.ts - // 基本服务
main.ts; // 入口文件
main.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();
- 创建应用程序实例,使用
@nestjs/core
提供的一个核心类NestFactory
; - 它暴露出了一些静态方法,可以用来创建应用程序实例;
create
方法 就是其中一个,执行之后返回一个INestApplication
应用程序对象。
注意事项:
程序在启动的过程中发现错误,会直接终止程序;若不想要终止程序,而是报错,需如下写法:
NestFactory.create(AppModule, { abortOnError: false })
平台性
Nest 默认支持两个 HTTP 平台:express
和 fastify
。每个平台都会暴露自己的对应接口:NestExpressApplication
和 NestFastifyApplication
。
// 指定 express 平台
import { NestExpressApplication } from "@nestjs/platform-express";
const app = await NestFactory.create<NestExpressApplication>(AppModule);
// 指定 fastify 平台
import {
FastifyAdapter,
NestFastifyApplication,
} from "@nestjs/platform-fastify";
const app = await NestFactory.create<NestFastifyApplication>(
AppModule,
new FastifyAdapter()
);
@nestjs/platform-express
是 nestjs 内置部分,但是@nestjs/platform-fastify
并不是内置部分,需要自己手动安装。
但是请注意,除非你确实想访问底层平台的 API,否则不需要指定类型。
注册全局事件
针对 Nest 提供的 AOP 能力,还可以在全局注册事件
- 中间件
- 拦截器
- 守卫
- 管道
- 异常拦截
// 中间件
import { Request, Response, NextFunction } from "express";
async function bootstrap() {
const app = await NestFactory.create(AppModule);
// 全局中间件
app.use((req: Request, res: Response, next: NextFunction) => {
console.log("middleware before");
next();
console.log("middleware after");
});
await app.listen(3000);
}
中间件跟 express 和 koa 是类似的。
// 拦截器
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalInterceptors(new xxxInterceptor()); // 全局拦截器
await app.listen(3000);
}
使用 useGlobalInterceptors
来注册全局拦截器。
// 守卫
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalGuards(new xxxGuards()); // 注册全局守卫
await app.listen(3000);
}
使用 useGlobalGuards
函数注册全局守卫。
// 管道
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new xxxPipe());
await app.listen(3000);
}
使用useGlobalPipes
函数注册全局管道。
// 异常处理
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalFilters(new xxxFilter());
await app.listen(3000);
}
使用 useGlobalFilters
函数注册全局异常处理。
针对中间件、守卫、管道、拦截器、异常拦截等知识点及使用,会在后面的系列中细说。
现在只需要知道,在入口文件中,可以具体能干些什么事情。
静态资源访问
利用 express 平台,暴露出静态资源
import { NestExpressApplication } from "@nestjs/platform-express";
async function bootstrap() {
const app = await NestFactory.create<NestExpressApplication>(AppModule);
app.useStaticAssets("public", { prefix: "/static" });
await app.listen(3000);
}
利用 useStaticAssets
来暴露出静态资源。
通过 http://xxxx:3000/static/index.html
类似形式访问。
注册第三方插件(中间件)
第三方插件:比如说 跨域(cors)
import { NestExpressApplication } from "@nestjs/platform-express";
import * as cors from "cors";
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.use(cors()); // 使用第三方插件
await app.listen(3000);
}
总结
- 安装 nest 脚手架推荐全局安装
- 学会使用
nest -h
来慢慢掌握 nest 的指令。 - nest 项目的启动文件
main.ts
在里面可以做比较多的事件,端口修改,执行平台,以及注册全局的事件。
在后续的学习中,发生其他的任务可以放在该文件下,也会后续更新。