提供程序是 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 {}
我们在来试试:

