解析管道
本课属于 Coddy Node.js 学习旅程的“TypeScript 和 NestJS”单元。第 17 课,共 24 课。
GET /tasks/abc 返回 404“任务 NaN 未找到”,但 abc 根本不是 ID:这是一个错误请求,状态码为 400。管道既可以转换,也可以检查。
@Get()
findAll(@Query('year', ParseIntPipe) year: number) {
return this.reportsService.forYear(year);
}作为参数装饰器的第二个参数传入时,ParseIntPipe 会在方法运行前将文本转换为数字。GET /reports?year=2026 会传入数字 2026,因此 year: number 终于成立了;?year=soon 会返回 400“验证失败(需要数字字符串)”,并且不会运行该方法。ParseBoolPipe 和 ParseUUIDPipe 的工作方式相同。
挑战
简单GET /tasks/abc和DELETE /tasks/abc返回 400。- 数字 id 和之前一样有效;未知的 id 仍然返回 404。
- 先发送
GET /tasks/abc,再发送GET /tasks/1,最后发送GET /tasks/9999。
亲手试试
import { Body, Controller, Delete, Get, HttpCode, Inject, Param, Post, Query } from '@nestjs/common';
import { CreateTaskDto } from './dto/create-task.dto';
import { Task, TasksService } from './tasks.service';
@Controller('tasks')
export class TasksController {
constructor(
private readonly tasksService: TasksService,
@Inject('PAGE_SIZE') private readonly pageSize: number,
) {}
@Get()
findAll(@Query('done') done?: string, @Query('page') page = '1') {
const tasks = this.tasksService.findAll(done);
const current = Number(page);
const start = (current - 1) * this.pageSize;
return {
items: tasks.slice(start, start + this.pageSize),
page: current,
total: tasks.length,
pages: Math.ceil(tasks.length / this.pageSize),
};
}
@Get(':id')
findOne(@Param('id') id: string): Task {
return this.tasksService.findOne(Number(id));
}
@Post()
create(@Body() dto: CreateTaskDto): Task {
return this.tasksService.create(dto);
}
@Delete(':id')
@HttpCode(204)
remove(@Param('id') id: string): void {
this.tasksService.remove(Number(id));
}
}
TypeScript 和 NestJS中的所有课
自己练习: Express 在线编辑器