Nest核心概念

Nest是当下一款流行的前端框架,本文将就其核心概念做介绍,希望读者通过阅读本文,可以对其核心概念和主要功能有一个大致的了解,以便可以快速上手开发

对于一个Nest项目来说通常其文件结构如下:

css 复制代码
src
 |-app.controller.spec.ts
 |-app.controller.ts
 |-app.module.ts
 |-app.service.ts
 |-main.ts

上述文件涵盖了Nest项目的核心文件和概念,这些文件功能如下:

文件 功能
app.controller.ts 具有单一路由的基本控制器
app.controller.spec.ts 控制器的单元测试
app.module.ts 应用的根模块
app.service.ts 具有单一方法的基本服务
main.ts 使用核心函数 NestFactory 创建 Nest 应用实例的应用入口文件

下面,结合上述文件,来展开介绍下Nest项目的核心概念

Controller

Controller对应上述文件中的app.controller.ts,主要职责是负责处理传入请求并向客户端返回响应,路由机制控制哪个控制器接收哪些请求。每个控制器可以有不止一个路由,不同的路由可以执行不同的操作

路由

ts 复制代码
import { Controller, Get } from '@nestjs/common';

@Controller('cats')
export class CatsController {
  @Get()
  findAll(): string {
    return 'This action returns all cats';
  }
}

在这个例子中,采用@Controller() 装饰器指定公共路径前缀/catsfindAll() 方法之前的 @Get() 装饰器告诉 NestGET类型的HTTP 请求创建处理程序。@Get() 装饰器可以声明路径字符串,例如 @Get('breed') 会将findAll方法与GET /cats/breed匹配。(对于@Controller('cats')+@Get(),只会匹配/cats路径,/cats/**不会被匹配)。在Nest中,findAll函数的名称是随意定义的,和匹配路径无关。

除了@Get()之外,还有 @Post()@Put()@Delete()@Patch()@Options()@Head(),此外还有 @All()用来处理上述所有

处理程序支持 async 功能,每个异步函数都必须返回 Promise。此外Nest 路由处理程序还能够返回 RxJS观察流。可以返回 Nest 能够自行解析的延迟值。让我们看一个例子:

ts 复制代码
@Get()
async findAll(): Promise<any[]> {
  return [];
}

findAll函数返回字符串,对于返回值,在Nest中有两大类:

分类 描述
标准 返回 JavaScript对象或数组时,会被自动序列化成 JSON;返回JavaScript原始类型不会自动做序列化处理,如返回 stringnumberboolean。这样设计的好处是,在 Nest 我们可以让对返回结果的处理变的更简单。返回的状态码默认总是 200
特定 可以用 @Res()装饰器来使用第三方库风格的代码,如 findAll(@Res() response){response.status(200).send()}
通配符

对于路径来说,支持通配符式的写法:

ts 复制代码
@Get('ab*cd')
findAll() {
  return 'This route uses a wildcard';
}
参数

当需要接受动态数据作为请求的一部分时(例如,GET /cats/1 获取 ID1),具有静态路径的路由将不起作用。为了定义带参数的路由,我们可以在路由的路径中使用 @Param() 装饰器访问以这种方式声明的路由参数

写法一:

ts 复制代码
@Get(':id')
findOne(@Param() params: any): string {
  console.log(params.id);
  return `This action returns a #${params.id} cat`;
}

写法二:

ts 复制代码
@Get(':id')
findOne(@Param('id') id: string): string {
  return `This action returns a #${id} cat`;
}

请求对象

Nest 提供对底层请求对象的访问(默认为 Express ),可以通过将 @Req() 装饰器添加到处理程序的签名来指示 Nest 注入它来访问请求对象:

ts 复制代码
// cats.controller.ts
import { Controller, Get, Req } from '@nestjs/common';
import { Request } from 'express';

@Controller('cats')
export class CatsController {
  @Get()
  findAll(@Req() request: Request): string {
    return 'This action returns all cats';
  }
}

标头

可以通过 @Header() 装饰器或库特定的响应对象 res.header()指定自定义响应标头

ts 复制代码
import { Controller, Get, Header } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
    constructor(private readonly appService: AppService) { }

    @Get()
    @Header('Cache-Control', 'none')
    getHello(): string {
        return this.appService.getHello();
    }
}

@nestjs/common 包中导入 Header

重定向

要将响应重定向到特定 URL ,你可以使用 @Redirect() 装饰器或库特定的响应对象 res.redirect()@Redirect() 有两个参数,urlstatusCode,两者都是可选的。如果省略,statusCode 的默认值为 302 (Found)

如果想要动态确定 HTTP 状态代码或重定向 URL,需返回遵循 HttpRedirectResponse 接口(来自 @nestjs/common)的对象来完成

返回值将覆盖传递给 @Redirect() 装饰器的任何参数。例如:

ts 复制代码
@Get('docs')
@Redirect('https://nest.nodejs.cn', 302)
getDocs(@Query('version') version) {
  if (version && version === '5') {
    return { url: 'https://nest.nodejs.cn/v5/' };
  }
}

作用域

node.js中,每个请求不是对应一个线程,因此几乎所有数据都是共享的。如果想要控制作用域,详见作用域控制

异常处理

异常 中单独介绍

Provider

ProviderNest 中的一个基本概念。许多基本的 Nest 类可以被视为提供者 ------ 服务、存储库、工厂、助手等等。Controller 应该处理 HTTP 请求并将更复杂的任务委托给Provider。提供程序是在 module 中声明为 providers 的纯 JavaScript

相关推荐
XiaoYu20027 天前
第3章 Nest.js拦截器
前端·ai编程·nestjs
XiaoYu20028 天前
第2章 Nest.js入门
前端·ai编程·nestjs
实习生小黄9 天前
NestJS 调试方案
后端·nestjs
当时只道寻常12 天前
NestJS 如何配置环境变量
nestjs
濮水大叔24 天前
VonaJS是如何做到文件级别精确HMR(热更新)的?
typescript·node.js·nestjs
ovensi24 天前
告别笨重的 ELK,拥抱轻量级 PLG:NestJS 日志监控实战指南
nestjs
ovensi25 天前
Docker+NestJS+ELK:从零搭建全链路日志监控系统
后端·nestjs
Gogo8161 个月前
nestjs 的项目启动
nestjs
没头发的卓卓1 个月前
新手入门:nest基本使用规则(适合零基础小白)
nestjs