Providers
- 控制器应处理 HTTP 请求并将更复杂的任务委托给 providers
- Provider 只是一个用 @Injectable() 装饰器注释的类
- 许多基本的 Nest 类都可能被视为 provider - service, repository, factory, helper 等,他们都可以通过 constructor 注入依赖关系
创建服务
- CatsService 是具有一个属性和两个方法的基本类。唯一的新特点是它使用 @Injectable() 装饰器
- 该服务将负责数据存储和检索,其由 CatsController(控制器)使用
该 @Injectable() 附加有元数据,因此 Nest 知道这个类是一个 Nest provider
cats.service.ts
import { Injectable } from '@nestjs/common';
// 定义数据类型
export class Cat {
name: string;
age: number;
breed: string;
}
@Injectable()
export class CatsService {
private readonly cats: Cat[] = [];
create(cat: Cat) {
this.cats.push(cat);
}
findAll(): Cat[] {
return this.cats;
}
}
使用服务
CatsService 是通过类构造函数注入的。注意这里使用了私有的只读语法。这意味着我们已经创建并初始化了 catsService 成员
cats.controller.ts
import { Controller, Get, Post, Body } from '@nestjs/common';
import { CatsService } from './cats.service';
// 定义数据类型
export class Cat {
name: string;
age: number;
breed: string;
}
//接口路由为cats
@Controller('cats')
export class CatsController {
// 将服务(CatsService)注入到控制器(CatsController)
constructor(private catsService: CatsService) {}
@Post()//post请求 新增数据
async create(@Body() createCat: Cat) {
// 使用catsService的create方法
this.catsService.create(createCat);
}
@Get()//get请求 获取数据
async findAll(): Promise<Cat[]> {
// 使用catsService的findAll方法
return this.catsService.findAll();
}
}
将服务在根模块中注册
app.module.ts
import { Module } from '@nestjs/common';
import { CatsController } from './cats/cats.controller'
import { CatsService } from './cats/cats.service'
@Module({
controllers: [CatsController],
providers: [CatsService],
})
export class AppModule { }
接口测试
测试 | 效果 |
---|---|
【获取】第一次获取数据返回一个空的列表[] | ![]() |
【插入】进行一次插入操作 | ![]() |
【获取】再次获取列表可以看到接口返回了一条数据 | ![]() |
【插入】第二次进行插入操作 | ![]() |
【获取】再获取列表可以看到变成了两条数据 | ![]() |
作用域
下面截图中,服务重启后重新获取列表,可以看到之前插入的数据已经不见了
因为当应用程序关闭时,每个 provider 都将被销毁