返回

Nest.js快速入门 (2/10) —— 服务

后端

服务是什么?

在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创建服务来将业务逻辑与控制器分开。我们还讨论了如何在控制器中使用服务以及如何测试服务。