Nest.js 提供者

530 阅读2分钟

提供程序是 Nest的一个基本概念。许多基本的 Nest类可能被视为提供者 - service,repository, factory, helper 等等。 他们都可以通过constructor注入依赖关系。这意味着对象可以彼此创建各种关系,并且“连接”对象实例的功能在很大程度上可以委托给 Nest运行时系统。 提供者只是一个用 @Injectable()装饰器注释的类。

使用cli创建服务类:

nest g service user

注意在项目的src目录下执行就好了额,如果你自己创建了文件夹,再在下面执行的话会多出来一层:

在src目录下执行nest cli命令时,会自动更新/app.module.ts,自建目录我测试的时候不会更新

创建好的user.service.ts文件如下:

import { Injectable } from '@nestjs/common';

@Injectable()
export class UserService {}

注:一同会创建*.spec.ts的文件这个我们可以不管,测试文件

接下来我们还需要准备一个接口文件user.interface.ts:

export interface User {
    // 用户姓名
    name: string;
    // 用户年龄
    age: number;
    // 用户性别
    gender: number;
}

然后我们在user.service.ts文件中使用接口文件:

import { Injectable } from '@nestjs/common';
import { User } from './user.interface';

@Injectable()
export class UserService {
    private readonly users: User[] = [];

    create(user: User) {
        this.users.push(user);
    }

    getAllUsers(): User[] {
        return this.users;
    }
}

有了服务类后,我们就可以在控制器中使用服务类来进行数据提供:

@Controller('user')
export class UserController {

    constructor(private readonly userService: UserService) { }

    @Get()
    async getAllUser(): Promise<User[]> {
        return this.userService.getAllUsers();
    }

    @Post("create")
    async createUser(@Body() userDao: UserDao) {
        this.userService.create(userDao)
    }
}

这里async是执行异步方法的关键字,其返回类型必须是一个Promis对象。另外一点就是这里使用了typescript构造函数语法来声明定义属性,当我们如上使用时typescript:

  • 声明了一个构造函数参数及其类型

  • 声明了一个同名的公共属性

  • 当我们 new 出该类的一个实例时,把该属性初始化为相应的参数值

如果我们类没有扩展其他提供程序,那么总是使用基于构造函数的注入是比较推荐的做法。关于定义提供程序更多的内容,这里不再说明。等后续我们用到的时候在学习。

现在我们已经定义了提供程序(CatsService),并且已经有了该服务的使用者(CatsController),我们需要在Nest中注册该服务,以便它可以执行注入。我们可以编辑模块文件(app.module.ts),然后将服务添加到@Module()装饰器的providers数组中。

其实如果是使用cli创建的话,已经自动进行了注册,如果没有的话,那么按照下面的内容添加即可:


@Module({
  imports: [],
  controllers: [AppController,UserController],
  providers: [AppService, UserService],
})
export class AppModule {}

我们在来试试: