Nest.js快速入门 (2/10) —— 服务
2023-12-23 02:13:53
服务是什么?
在Nest.js中,服务是一个类,它负责处理应用程序的业务逻辑。服务可以被控制器、其他服务或应用程序中的任何其他部分使用。
服务可以被视为应用程序的后台。它们负责执行实际的工作,如处理数据、执行计算或与数据库交互。
为什么使用服务?
使用服务有很多好处,包括:
- 可维护性:服务可以帮助我们使代码更具可维护性。当业务逻辑被分离到服务中时,就更容易对其进行更改和更新。
- 可测试性:服务可以帮助我们使代码更具可测试性。我们可以轻松地测试服务,而无需启动整个应用程序。
- 代码重用:服务可以被应用程序中的任何其他部分重用。这可以帮助我们避免重复编写相同的代码。
- 依赖注入:Nest.js支持依赖注入,这使我们能够轻松地在服务之间创建依赖关系。
如何创建服务?
要创建服务,我们需要在项目目录中创建一个新的文件。该文件的文件名应该以.service.ts结尾。
例如,我们可以创建一个名为coffees.service.ts的文件:
import { Injectable } from '@nestjs/common';
@Injectable()
export class CoffeesService {
findAll() {
return ['Cappuccino', 'Espresso', 'Latte'];
}
}
在上面的代码中,我们导入了Injectable装饰器,该装饰器告诉Nest.js这是一个服务类。我们还导入了CommonJS模块,以便我们可以使用findAll()方法。
findAll()方法返回一个字符串数组,其中包含了咖啡的类型。
如何在控制器中使用服务?
为了在控制器中使用服务,我们需要在控制器类中注入该服务。我们可以使用Nest.js的依赖注入功能来做到这一点。
例如,我们可以在coffees.controller.ts文件中创建一个名为CoffeesController的控制器:
import { Controller, Get } from '@nestjs/common';
import { CoffeesService } from './coffees.service';
@Controller('coffees')
export class CoffeesController {
constructor(private readonly coffeesService: CoffeesService) {}
@Get()
findAll() {
return this.coffeesService.findAll();
}
}
在上面的代码中,我们导入了Controller和Get装饰器,这些装饰器告诉Nest.js这是一个控制器类和一个GET路由处理程序。
我们还导入了CoffeesService类,以便我们可以使用它。
在构造函数中,我们使用了依赖注入功能来注入CoffeesService。
findAll()方法调用了CoffeesService的findAll()方法,并返回结果。
如何测试服务?
我们可以使用Nest.js的测试框架来测试服务。
例如,我们可以创建一个名为coffees.service.spec.ts的文件,其中包含以下内容:
import { Test, TestingModule } from '@nestjs/testing';
import { CoffeesService } from './coffees.service';
describe('CoffeesService', () => {
let service: CoffeesService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [CoffeesService],
}).compile();
service = module.get<CoffeesService>(CoffeesService);
});
it('should return an array of coffees', () => {
const coffees = service.findAll();
expect(coffees).toEqual(['Cappuccino', 'Espresso', 'Latte']);
});
});
在上面的代码中,我们导入了Test和TestingModule类,以便我们可以使用Nest.js的测试框架。
我们还导入了CoffeesService类,以便我们可以测试它。
在describe()块中,我们创建了一个新的测试模块,并将其编译。
在beforeEach()块中,我们获取CoffeesService实例。
在it()块中,我们测试了findAll()方法是否返回了正确的咖啡数组。
结论
在本文中,我们讨论了如何使用Nest.js创建服务来将业务逻辑与控制器分开。我们还讨论了如何在控制器中使用服务以及如何测试服务。