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

相关推荐
Spirited_Away4 天前
Nest世界中的AOP
前端·node.js·nestjs
Eric_见嘉11 天前
NestJS 🧑‍🍳 厨子必修课(六):Prisma 集成(下)
前端·后端·nestjs
kongxx1 个月前
NestJS中使用Guard实现路由保护
nestjs
白雾茫茫丶1 个月前
Nest.js 实战 (十二):优雅地使用事件发布/订阅模块 Event Emitter
nestjs·nest.js·发布订阅·event emitter
lph65822 个月前
比起上传资源更应该懂得如何资源回收
node.js·nestjs
gsls2008082 个月前
将nestjs项目迁移到阿里云函数
阿里云·云计算·nestjs·云函数
d3126975102 个月前
在Nestjs使用mysql和typeorm
mysql·express·nestjs·typeorm
剪刀石头布啊2 个月前
nestjs-版本控制
nestjs
潇洒哥gg3 个月前
重生之我在NestJS中使用jwt鉴权
前端·javascript·nestjs
huangkaihao3 个月前
【NestJS学习笔记】 之 自定义装饰器
前端·node.js·nestjs