欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Nest.js系列學(xué)習(xí)控制器使用示例詳解

 更新時(shí)間:2023年02月14日 09:49:45   作者:water  
這篇文章主要為大家介紹了Nest.js系列控制器使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

控制器是什么

控制器負(fù)責(zé)處理傳入的請求和向客戶端返回響應(yīng),控制器的目的是接收應(yīng)用的特定請求。路由機(jī)制控制哪個(gè)控制器接收哪些請求。通常,每個(gè)控制器有多個(gè)路由,不同的路由可以執(zhí)行不同的操作。如果要創(chuàng)建一個(gè)簡單的路由器,我們使用類和裝飾器。裝飾器將類與所需的元數(shù)據(jù)相關(guān)聯(lián),并使nest能夠創(chuàng)建路由映射(將請求綁定到相應(yīng)的控制器)

路由

路由是通過@Coutroller裝飾器裝飾的一個(gè)類,就是一個(gè)基本的控制器。@Coutroller接受一個(gè)參數(shù),可以輕松的對一組相關(guān)的路由進(jìn)行分組,并最大程度的減少重復(fù)代碼。

import { Controller, Get } from '@nestjs/common'
@Controller('water')
export class WaterController {
  @Get()
  findAll(): string {
    return 'water'
  }
}

以上代碼findAll方法上有一個(gè)@Get裝飾器,這個(gè)裝飾器是http請求方法裝飾器,表示創(chuàng)建了一個(gè)get請求。而且@Get也可以接受一個(gè)參數(shù),表示一個(gè)具體的路由路徑

import { Controller, Get } from '@nestjs/common'
@Controller('water')
export class WaterController {
  @Get('list')
  findAll(): string {
    return 'water'
  }
}

然后請求路由的地址是 GET /water/list

Request請求對象

Nest提供對底層平臺(默認(rèn)為Express)的請求對象(request)的訪問方式,就可以在處理函數(shù)的簽名中使用@Req()裝飾器。

import { Controller, Get, Req } from '@nestjs/common';
import { Request } from 'express';
@Controller('water')
export class CatsController {
  @Get()
  findAll(@Req() request: Request): string {
    return 'water';
  }
}

Request對象代表HTTP請求體,并具有查詢字符串,請求參數(shù),http標(biāo)頭和正文(http body)的屬性。下面是裝飾器對照的列表

@Request(),@Req()req
@Response(),@Res()res
@Next()next
@Session()req.session
@Param(key?: string)req.params/req.params[key]
@Body(key?: string)req.body/req.body[key]
@Query(key?: string)req.query/req.query[key]
@Headers(name?: string)req.headers/req.headers[name]
@Ip()req.ip
@HostParam()req.hosts

多種請求方式

import { Controller, Get, Post } from '@nestjs/common';
@Controller('water')
export class CatsController {
  @Post()
  create(): string {
    return 'water';
  }
  @Get()
  findAll(): string {
    return 'water';
  }
}

Nest 為所有標(biāo)準(zhǔn)的 HTTP 方法提供了相應(yīng)的裝飾器:@Put()、@Delete()、@Patch()、@Options()、以及 @Head()。此外,@All() 則用于定義一個(gè)用于處理所有 HTTP 請求方法的處理程序。

路由通配符

路由支持模式匹配

@Get('ab*cd')
findAll() {
	return 'water'
}

路由路徑 'ab*cd' 將匹配 abcd 、ab_cd 、abecd 等。字符 ? 、+ 、 * 以及 () 是它們的正則表達(dá)式對應(yīng)項(xiàng)的子集。連字符(-) 和點(diǎn)(.)按字符串路徑逐字解析。

狀態(tài)碼

默認(rèn)情況下,響應(yīng)的狀態(tài)碼總是默認(rèn)為 200,除了 POST 請求(默認(rèn)響應(yīng)狀態(tài)碼為 201),我們可以通過在處理函數(shù)外添加 @HttpCode(...) 裝飾器來輕松更改此行為。

@Post()
@HttpCode(204)
create() {
  return 'water';
}

Headers

要指定自定義響應(yīng)頭,可以使用 @header() 裝飾器或類庫特有的響應(yīng)對象,(并直接調(diào)用 res.header())。

@Post()
@Header('Cache-Control', 'none')
create() {
  return 'water';
}

重定向

要將響應(yīng)重定向到特定的 URL,可以使用 @Redirect() 裝飾器或特定于庫的響應(yīng)對象(并直接調(diào)用 res.redirect())。

@Redirect() 裝飾器有兩個(gè)可選參數(shù),url 和 statusCode。 如果省略,則 statusCode 默認(rèn)為 302。

@Get()
@Redirect('https://nestjs.com', 301)

有時(shí)可能想動態(tài)地決定 HTTP 狀態(tài)代碼或重定向 URL。通過從路由處理方法返回一個(gè)如下格式的對象

{
  "url": string,
  "statusCode": number
}

返回的值將覆蓋傳遞給 @Redirect()裝飾器的所有參數(shù)。

@Get('docs')
@Redirect('https://docs.nestjs.com', 302)
getDocs(@Query('version') version) {
  if (version && version === '5') {
    return { url: 'https://docs.nestjs.com/v5/' };
  }
}

路由參數(shù)

當(dāng)您需要接受動態(tài)數(shù)據(jù)(dynamic data)作為請求的一部分時(shí)(例如,使用GET /cats/1 來獲取 id 為 1 的 cat),帶有靜態(tài)路徑的路由將無法工作。為了定義帶參數(shù)的路由,我們可以在路由路徑中添加路由參數(shù)標(biāo)記(token)以捕獲請求 URL 中該位置的動態(tài)值。下面的 @Get() 裝飾器示例中的路由參數(shù)標(biāo)記(route parameter token)演示了此用法。以這種方式聲明的路由參數(shù)可以使用 @Param() 裝飾器訪問,該裝飾器應(yīng)添加到函數(shù)簽名中。

@Get(':id')
findOne(@Param() params): string {
  console.log(params.id);
  return params.id;
}

@Param() 用于修飾一個(gè)方法的參數(shù)(上面示例中的 params),并在該方法內(nèi)將路由參數(shù)作為被修飾的方法參數(shù)的屬性。如上面的代碼所示,我們可以通過引用 params.id來訪問(路由路徑中的) id 參數(shù)。 您還可以將特定的參數(shù)標(biāo)記傳遞給裝飾器,然后在方法主體中按參數(shù)名稱直接引用路由參數(shù)。

@Get(':id')
findOne(@Param('id') id): string {
  return id;
}

子域路由

@Controller 裝飾器可以接受一個(gè) host 選項(xiàng),以要求傳入請求的 HTTP 主機(jī)匹配某個(gè)特定值。

@Controller({ host: 'admin.example.com' })
export class AdminController {
  @Get()
  index(): string {
    return 'Admin page';
  }
}

與一個(gè)路由路徑 path 類似,該 hosts 選項(xiàng)可以使用參數(shù)標(biāo)識(token)來捕獲主機(jī)名中該位置的動態(tài)值。下面的 @Controller() 裝飾器示例中的主機(jī)參數(shù)標(biāo)識(host parameter token)演示了此用法??梢允褂?@HostParam() 裝飾器訪問以這種方式聲明的主機(jī)參數(shù),該裝飾器應(yīng)添加到方法簽名中。

@Controller({ host: ':account.example.com' })
export class AccountController {
  @Get()
  getInfo(@HostParam('account') account: string) {
    return account;
  }

異步性

Nest支持異步函數(shù)特性,每個(gè)異步函數(shù)都必須返回一個(gè)Promise

@Get()
async findAll(): Promise<any[]> {
  return [];
}

也可以使用RxJs observable流,Nest路由處理程序更加強(qiáng)大,Nest 將自動訂閱下面的源并獲取最后發(fā)出的值(在流完成后)。

@Get()
findAll(): Observable<any[]> {
  return of([]);
}

DTO

DTO是什么

數(shù)據(jù)傳輸對象(DTO)(Data Transfer Object),是一種設(shè)計(jì)模式之間傳輸數(shù)據(jù)的軟件應(yīng)用系統(tǒng)。數(shù)據(jù)傳輸目標(biāo)往往是數(shù)據(jù)訪問對象從數(shù)據(jù)庫中檢索數(shù)據(jù)。數(shù)據(jù)傳輸對象與數(shù)據(jù)交互對象或數(shù)據(jù)訪問對象之間的差異是一個(gè)以不具有任何行為除了存儲和檢索的數(shù)據(jù)(訪問和存取器)。

簡單可以理解為,DTO本身像是一個(gè)指南,當(dāng)在使用API時(shí),方便了解請求期望的數(shù)據(jù)類型以及返回的數(shù)據(jù)對象。

DTO是一個(gè)對象,它定義了如何通過網(wǎng)絡(luò)發(fā)送數(shù)據(jù)。我們可以通過使用 TypeScript 接口(Interface)或簡單的類(Class)來定義 DTO 模式。有趣的是,我們在這里推薦使用。為什么?類是 JavaScript ES6 標(biāo)準(zhǔn)的一部分,因此它們在編譯后的 JavaScript 中被保留為實(shí)際實(shí)體。另一方面,由于 TypeScript 接口在轉(zhuǎn)換過程中被刪除,所以 Nest 不能在運(yùn)行時(shí)引用它們。這一點(diǎn)很重要,因?yàn)橹T如管道(Pipe)之類的特性為在運(yùn)行時(shí)訪問變量的元類型提供更多的可能性。

/*
  create-cat.dto.ts
*/
export class CreateCatDto {
  readonly name: string;
  readonly age: number;
  readonly breed: string;
}
@Post()
async create(@Body() createCatDto: CreateCatDto) {
  return 'This action adds a new cat';
}
  • 為什么不直接使用interface來定義DTO而是使用class,因?yàn)閠ypescript在編譯之后會刪除interface
  • 為什么不使用實(shí)體而是定義一個(gè)DTO,因?yàn)镠TTP請求傳參和返回的內(nèi)容可以采用和數(shù)據(jù)庫中保存的內(nèi)容不同的格式。

一個(gè)完整的控制器路由例子

import { Controller, Get, Query, Post, Body, Put, Param, Delete } from '@nestjs/common';
import { CreateCatDto, UpdateCatDto, ListAllEntities } from './dto';
@Controller('cats')
export class CatsController {
  @Post()
  create(@Body() createCatDto: CreateCatDto) {
    return 'This action adds a new cat';
  }
  @Get()
  findAll(@Query() query: ListAllEntities) {
    return `This action returns all cats (limit: ${query.limit} items)`;
  }
  @Get(':id')
  findOne(@Param('id') id: string) {
    return `This action returns a #${id} cat`;
  }
  @Put(':id')
  update(@Param('id') id: string, @Body() updateCatDto: UpdateCatDto) {
    return `This action updates a #${id} cat`;
  }
  @Delete(':id')
  remove(@Param('id') id: string) {
    return `This action removes a #${id} cat`;
  }
}

小結(jié)

總體而言,控制器就是對請求的api路由的一個(gè)匹配,然后對應(yīng)上相應(yīng)的路由之后,再去用相應(yīng)的服務(wù)去處理。在控制器處理的過程中可以對請求參數(shù)進(jìn)行一些處理。遵循單一原則,只做一件事情。

以上就是Nest.js系列控制器使用示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Nest.js 控制器的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論