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
- 查看运行效果:http://localhost:3000/
说明:开发时,可以使用
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 目录下进行管理。