Nest 安装,指令,及入口文件分析

514 阅读4分钟

01_cover.png

阅读 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 即可查看所有的指令。

01_1.png

在上面的图中,可以很清晰看出 nest 指令的基本格式,nest 的指令选项,nest 的指令别名和描述等等一系列。

在前期学习的时候,可以仔细的研究一下每个指令的含义,加深自己的理解,但是不需要死记硬背。在后期的开发中,当忘记的时候,只需要输入 nest -h 帮你回忆即可。

就对于我自己而言,现阶段不是使用指令创建项目,就是使用指令开创建代码片段。

  • nest new projectName
  • nest 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 平台:expressfastify。每个平台都会暴露自己的对应接口:NestExpressApplicationNestFastifyApplication

// 指定 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 在里面可以做比较多的事件,端口修改,执行平台,以及注册全局的事件。

在后续的学习中,发生其他的任务可以放在该文件下,也会后续更新。