NestJS中的控制器和服务的使用方式
发布时间: 2023-12-24 08:55:11 阅读量: 22 订阅数: 48
# 1. 简介
## 1.1 NestJS简介
NestJS 是一个基于 TypeScript 的开发框架,旨在提供一种简单且功能强大的方法来构建高度可测试、可扩展且易于维护的应用程序。它结合了 OOP(面向对象编程)、FP(函数式编程)和FRP(函数式反应编程)的元素,且使用了现代的设计模式。NestJS 支持通过使用现代的、可插拔的模块化体系结构,构建高度模块化的应用程序。它还提供了对 Express 和 Fastify 等流行的 HTTP 服务器的支持。
## 1.2 控制器和服务的概念
在 NestJS 中,控制器负责处理传入的请求,并将响应返回给客户端。它们的主要目的是接收请求、从服务中获取数据,然后返回响应。服务是一个具有特定目的的类,它可以被注入到控制器中。它们通常包含业务逻辑,并可以处理任何与数据相关的任务。
## 1.3 本文目的
本文将详细介绍在 NestJS 中如何使用控制器和服务,包括控制器的创建、路由和请求处理、控制器的中间件和管道,以及服务的创建、依赖注入、作用域等内容。同时,还将演示控制器和服务之间的交互,并设计一个实际应用程序的示例来加深理解。
### 2. 控制器
控制器在NestJS中扮演着路由请求的处理者角色。它负责接收客户端的请求并返回相应的响应。在本章节中,我们将深入探讨控制器的创建、路由和请求处理以及控制器的中间件和管道。
#### 2.1 创建控制器
在NestJS中,创建一个控制器非常简单。我们只需要使用 `@Controller()` 装饰器来装饰一个普通的类,并指定其路由的路径。例如:
```typescript
// cats.controller.ts
import { Controller, Get } from '@nestjs/common';
@Controller('cats')
export class CatsController {
@Get()
findAll(): string {
return 'This action returns all cats';
}
}
```
在上面的例子中,`@Controller('cats')` 装饰器指定了该控制器的基本路径为 `/cats`。而 `@Get()` 装饰器表示这是一个处理 HTTP GET 请求的方法。
#### 2.2 路由和请求处理
在NestJS中,路由和请求处理是通过装饰器来实现的。控制器中的方法可以使用装饰器来指定处理不同类型请求的路由路径、请求参数、请求体等信息。例如:
```typescript
// cats.controller.ts
import { Controller, Get, Post, Body, Param } from '@nestjs/common';
@Controller('cats')
export class CatsController {
@Get()
findAll(): string {
return 'This action returns all cats';
}
@Get(':id')
findOne(@Param('id') id: string): string {
return `This action returns a #${id} cat`;
}
@Post()
create(@Body() createCatDto: any): string {
return `This action adds a new cat with the name: ${createCatDto.name}`;
}
}
```
在上面的例子中,`@Get(':id')` 中的 `:id` 表示动态路由参数,而 `@Param('id')` 装饰器用于获取路由参数的值。
#### 2.3 控制器的中间件和管道
NestJS允许通过中间件和管道来对控制器进行全局或局部的处理。中间件在处理请求之前或之后执行某些操作,而管道则用于转换输入数据、验证数据等。我们可以通过装饰器来将中间件和管道应用到控制器的方法上。例如:
```typescript
// logger.middleware.ts
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
console.log('Request...');
next();
}
}
// cats.controller.ts
import { Controller, Get, Use, UseInterceptors } from '@nestjs/common';
import { LoggerMiddleware } from 'logger.middleware';
@Controller('cats')
@Use(LoggerMiddleware)
export class CatsController {
@Get()
findAll(): string {
return 'This action returns all cats';
}
}
```
在上面的例子中,我们通过 `@Use(LoggerMiddleware)` 装饰器将 `LoggerMiddleware` 中间件应用到了 `findAll()` 方法上。
###
0
0