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()
装饰器指定公共路径前缀/cats
,findAll()
方法之前的 @Get()
装饰器告诉 Nest
为 GET
类型的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 原始类型不会自动做序列化处理,如返回 string 、number 、boolean 。这样设计的好处是,在 Nest 我们可以让对返回结果的处理变的更简单。返回的状态码默认总是 200 |
特定 | 可以用 @Res() 装饰器来使用第三方库风格的代码,如 findAll(@Res() response){response.status(200).send()} |
通配符
对于路径来说,支持通配符式的写法:
ts
@Get('ab*cd')
findAll() {
return 'This route uses a wildcard';
}
参数
当需要接受动态数据作为请求的一部分时(例如,GET /cats/1
获取 ID
为 1
),具有静态路径的路由将不起作用。为了定义带参数的路由,我们可以在路由的路径中使用 @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()
有两个参数,url
和 statusCode
,两者都是可选的。如果省略,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
Provider
是 Nest
中的一个基本概念。许多基本的 Nest
类可以被视为提供者 ------ 服务、存储库、工厂、助手等等。Controller
应该处理 HTTP
请求并将更复杂的任务委托给Provider
。提供程序是在 module
中声明为 providers
的纯 JavaScript
类