【管理后台】后端框架搭建 - NestJS

1. 快速NestJS框架搭建

Nest(NestJS)是一个用于构建高效、可扩展的 Node.js 服务端应用的框架。
官网介绍:https://docs.nestjs.cn/introduction

总结:NestJS 是 Node.js 领域的 Spring 框架(如果你熟悉 Java),基于TypeScript,提供依赖注入、模块化等企业级特性,能快速构建可维护的后端API服务。

  • 创建新项目
# 全局安装 Nest CLI 脚手架
npm i -g @nestjs/cli
# 使用脚手架命令创建新项目
nest new book-admin-api
  • 启动项目
npm run start

说明:开发时,可以使用 npm run start:dev 命令进行接口调试,好处是修改完文件后及时生效,不用再重新启动。

2. NestJS核心--Controller(控制器)

控制器负责处理传入的请求并向客户端返回响应。

/// app.controller.ts
import { Body, Controller, Delete, Get, HttpException, HttpStatus, Param, Post, Put, Query, UseFilters } from '@nestjs/common';
import { AppService, BookDto } from './app.service';
import { HttpExceptionFilter } from './exception/http-exception.filter';

/// 一个具有单个路由的基本控制器。
@Controller() // 控制器装饰器,标记该类为控制器
// 控制器是 NestJS 中处理请求的主要组件,它们定义了路由。控制器 负责处理传入的请求,和向客户端返回响应。
export class AppController { // 控制器
  constructor(
    private readonly appService: AppService
  ) { } // AppService 是一个提供应用程序服务的类(Provider 提供者)

  // 根路由
  @Get()
  getHello(): string {
    return this.appService.getHello();
  }

  @Get('/test')
  getTest(): any {
    return {
      code: 200,
      message: 'Hello Test!',
      data: null
    };
  }

  // CRUD 数据库的增删改查
  // Restful API 规范(是一种开发规范)。Get:获取数据,Post:插入数据,Put:更新数据,Delete:删除数据。
  @Get('/books/:id') // 路由(带参数)
  getBookById(@Param() params: any) {
    // 通过 @Param() 获取路由参数
    console.log(params);
    if (!params.id) {
      // 方式1:直接抛出自定义异常
      throw new HttpException({ code: HttpStatus.BAD_REQUEST, message: '书籍 ID 不能为空' }, HttpStatus.BAD_REQUEST);
    }
    return this.appService.getBookById(params.id);
  }

  @Get('/books')
  getBooks(@Query() query: any) {
    // 通过 @Query() 获取查询参数
    console.log(query);
    return this.appService.getBooks(query);
  }

  @Post('/books')
  @UseFilters(new HttpExceptionFilter()) // 方式2:手动绑定过滤器,使用自定义异常过滤器处理异常
  createBook(@Body() body: any) {
    // 通过 @Body() 获取请求体
    console.log(body);
    return this.appService.createBook(body);
  }

  @Put('/books')
  updateBook(@Body() dto: BookDto) {
    // 通过 @Body() 获取请求体
    console.log(dto);
    return this.appService.updateBook(dto);
  }

  @Delete('/books/:id')
  deleteBook(@Param() params: any) {
    // 通过 @Param() 获取路由参数
    console.log(params);
    return this.appService.deleteBook(params.id);
  }

  // 获取请求参数的3种方式
  // @Param(): Restful API 参数;如:/books/:id
  // @Query(): 查询参数(url参数);如:/books?id=xxx
  // @Body(): 请求体(Post请求参数);如:{ "title": "新书", "author": "作者" }

}

Controller层,主要是做接口的 路由映射、用户请求和接口响应。业务逻辑查询等逻辑通常放到 Service 中去处理。

  • 自定义异常过滤器


3. NestJS核心 -- Provider(提供者)

提供者(Provider)是 Nest 的核心概念之一。许多基础的 Nest 类(如服务 Service、存储库、工厂和辅助工具)都可以被视为提供者。提供者的核心特性在于它能够作为依赖项被注入到其他类中。

Provider的定位是服务层,主要是写接口的业务逻辑代码。

  • 拆分 Controller 层的业务逻辑代码 Service 层
/// app.service.ts
import { Injectable } from '@nestjs/common';

/// 一个具有单个方法的基本服务。
// 应用服务类,提供应用的业务逻辑
@Injectable() // Injectable 装饰器标记该类为可注入的服务
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }

  getBookById(id: number): string {
    return '获取指定书籍:' + id;
  }

  getBooks(query: any): string {
    console.log(query);
    return '获取所有书籍';
  }

  createBook(dto: BookDto): string {
    return '创建一本新书:' + JSON.stringify(dto);
  }

  updateBook(dto: BookDto): string {
    return '更新指定书籍:' + dto.id + ',数据:' + JSON.stringify(dto);
  }

  deleteBook(id: number): string {
    return '删除指定书籍:' + id;
  }
}

/// 定义 DTO(数据传输对象)模式,DTO 是一个规定了网络数据传输格式的对象
export class BookDto {
  id: number;
  title: string;
  author: string;
  desc: string;
}

4. NestJS核心 -- Module(模块)

  • 模块是一个用 @Module() 装饰器注解的类。该装饰器提供了元数据,Nest 使用它来有效地组织和管理应用程序结构。


  • 使用 nest 脚手架命令:创建文件及目录(会自动引入相关依赖)

# 先创建模块(会自动生成 user.module.ts 文件,及 user 目录 )
nest g module user
# 再创建控制器(会自动生成 user.controller.ts  和 user.controller.spec.ts 文件 )
nest g controller user

管道:

管道有两种典型用例:
转换 :将输入数据转换为所需形式(例如从字符串转换为整数)
验证 :评估输入数据,若有效则原样传递;否则抛出异常
对控制器路由处理器正在处理的参数进行操作。Nest 在方法调用前插入管道,管道接收目标方法的参数并对其进行操作。任何转换或验证操作都在此时进行,之后路由处理器将使用(可能已被转换的)参数被调用。

/// user.controller.ts
import { Controller, Get, Param, ParseIntPipe } from '@nestjs/common';

@Controller('user')
export class UserController {
    @Get('/:id')
    // 给方法参数「绑定管道」,用于在方法调用前,对请求参数进行类型转换/验证参数是否有效,如果类型转换失败/验证失败,Nest会抛出异常。
    // 这里的 ParseIntPipe 是Nest内置的类型「转换管道」,用于将字符串类型的 id 转换为数字类型。
    getUser(@Param('id', ParseIntPipe) id: number) {
        // 获取用户信息
        return `用户信息:${id}`;
    }
}
  • 同样使用 nest 脚手架命令,创建其他业务模块,创建完后并将业务模块文件夹移动到 modules 目录下进行管理。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容