使用 Nest CLI 生成一個(gè)基本的控制器
使用 CLI 提供的 generate (別名:g) 命令生成一個(gè)基本的 users Controller (別名: co):
$ nest g co users
CREATE /src/users/users.controller.spec.ts (478 bytes)
CREATE /src/users/users.controller.ts (99 bytes)
UPDATE /src/app.module.ts (658 bytes)
Nest CLI 會(huì)自動(dòng)在 src 目錄下創(chuàng)建一個(gè) users 目錄作為 users 模塊捆昏,并且在 app.module.ts 中注入該控制器:
src/app.module.ts
import { Module } from '@nestjs/common';
import { UsersController } from './users/users.controller';
@Module({
controllers: [UsersController],
})
export class ApplicationModule {}
src/users/user.controller.ts
import { Controller } from '@nestjs/common';
@Controller('users')
export class UsersController {}
控制器必須使用 @Controller() 裝飾器修飾缤剧,傳入的 'users' 就是該控制器中所有 action 的路由前綴学辱。
去中心化的路由
首先在 user 控制器同級(jí)創(chuàng)建一個(gè) interfaces 目錄,并定義一個(gè) User 接口:
src/users/interfaces/user.interface.ts
export interface User {
readonly id: number;
readonly name: string;
readonly age: number;
}
現(xiàn)在給這個(gè)控制器添加一個(gè)獲取所有用戶的 action:
import { Controller, Get } from '@nestjs/common';
import { User } from './interfaces/user.interface';
@Controller('users')
export class UsersController {
@Get()
async findAll(): Promise<User[]> {
return [{
id: 1,
name: '小明',
age: 18
}];
}
}
這里使用 Async / Await 語法膝但,并返回一個(gè)泛型 Promise<User[]>。
此時(shí)使用 npm run start:dev 啟動(dòng)項(xiàng)目谤草,并訪問 http://127.0.0.1:3000/users跟束,在 chrome 開發(fā)者工具中可以看到請(qǐng)求的響應(yīng)信息。
有三個(gè)比較重要的地方:
Status Code: 200 OK // 響應(yīng)狀態(tài)代碼在默認(rèn)情況下總是 200
Content-Type: application/json; charset=utf-8 // 當(dāng)返回 JavaScript 對(duì)象或數(shù)組時(shí), 它會(huì)自動(dòng)轉(zhuǎn)換為 JSON丑孩。當(dāng)返回字符串, Nest 將只發(fā)送一個(gè)字符串而不嘗試解析它冀宴。
X-Powered-By: Express // 底層服務(wù)使用 Express
Nest 以同樣的方式提供了其他的裝飾器來處理不同類型的 HTTP請(qǐng)求 - @Put(),@Delete()温学,@Patch()略贮,@Options(),@Head() 和 @All()。
@Post()
async create() {
// TODO:創(chuàng)建新用戶
}
@Put()
async edit() {
// TODO: 修改用戶信息
}
@Delete()
async remove() {
// TODO:刪除已有用戶
}
所有這些裝飾器都從 @nestjs/common 包中導(dǎo)出:
import { Controller, Param, Get, Post, Put, Delete } from '@nestjs/common';
帶參數(shù)的路由
和 Express 帶參數(shù)的路由一樣逃延,只需要在 @Get() 裝飾器中傳入 " : + [ 參數(shù)名 ] "览妖,新增一個(gè) findOne Action:
@Get(':id')
async findOne(@Param() params): Promise<User> {
return {
id: params.id,
name: '小明',
age: 18
};
}
現(xiàn)在訪問 http://127.0.0.1:3000/users/44 將得到以下輸出:
{"id":"44","name":"小明","age":18}
下面這個(gè)表就是 Nest 裝飾器和 HTTP 請(qǐng)求上下文對(duì)象的映射關(guān)系: