10.Nest

Nest

近些年来,随着 Node.js 的发展,JavaScript 日渐成为 Web 开发中前后端皆可用的最流行语言,也为 Angular、React、Vue.js 这些优秀的前端项目的崛起提供了基石。而 Next.js 则致力于提供开箱即用的应用架构,允许开发者快速构建高可测试、可扩展、松耦合、易维护的 Node.js Web 应用。

Nest.js 基于 TypeScript 构建,其和 TypeScript 无缝衔接,同时允许开发者使用现代 JavaScript 进行开发。Nest.js 融合了面向对象编程 OOP、函数式编程 FP、函数响应式编程 FRP 的优秀思想,为开发者提供了完善的功能特性与使用体验;其底层使用了 Express,也方便了开发者集成 Express 生态圈相关的第三方插件。Next.js 的主要特性包括:依赖注入、WebSockets、模块化、响应式微服务、异常处理层、用于校验的 Pipe、用于角色化权限控制的 Guards、Interceptors、单元测试与集成测试等。

注:本系列是对于官网文档和示例,以及笔者自身实践过程中的代码总结。

快速开始

本部分主要介绍 Nest.js 项目的基本搭建与请求处理相关内容,建议是直接下载官方的 TypeScript 模板作为项目初始化模板:

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

典型的 Nest 项目会包含如下的模块:

src
├── app.controller.spec.ts
├── app.controller.ts
├── app.module.ts
├── app.service.ts
└── main.ts
import { NestFactory } from "@nestjs/core";

import { ApplicationModule } from "./modules/ApplicationModule";

async function bootstrap() {
  const app = await NestFactory.create(ApplicationModule);

  await app.listen(3000);
}

bootstrap();

控制器

// ApplicationModule.ts

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

import { HelloController } from "../controller/HelloController";

@Module({
  modules: [],

  controllers: [HelloController],
})
export class ApplicationModule {}
// HelloController.ts

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

@Controller("/")
export class HelloController {
  @Get()
  hello() {
    return "Next.js Boilerplate @ 王下邀月熊";
  }
}
import { Controller, Get, Post } from "@nestjs/common";

@Controller("cats")
export class CatsController {
  @Post()
  create() {
    // TODO: Add some logic here
  }

  @Get()
  findAll() {
    return [];
  }
}

平台

Nest 的目标是一个平台无关的框架。这个意思就是说 Nest 本身并不造某个细分领域的轮子,他只构建一套构架体系,然后把一些好用的库或者平台融合进来。所以 Nest 可以衔接任何 HTTP 框架,默认支持 express 和 fastify 两个 web 框架。

  • platform-express: Express 是一个 Node web 框架,有很多社区成熟的资源。@nestjs/platform-express 默认会被引入,大家都很熟悉了,用起来会容易上手

  • platform-fastify: Fastify 是一个高能低耗的框架,致力于最大化效率与速度

无论使用哪个平台,都要暴露自己的应用接口。上面两个平台暴露了对应的两个变量 NestExpressApplication and NestFastifyApplication。如下的代码会创建一个 app 对象,并且指定了使用 NestExpressApplication 平台:

const app = await NestFactory.create<NestExpressApplication>(ApplicationModule);

不过一般情况下不需要指定这个类型。

Links