从另一个模块注入 nestjs 服务
Inject nestjs service from another module
我有一个 PlayersModule
和一个 ItemsModule
。
我想在PlayersService
中使用ItemsService
。
当我注入时:
import { Injectable } from '@nestjs/common';
import { InjectModel } from 'nestjs-typegoose';
import { ModelType, Ref } from 'typegoose';
import { Player } from './player.model';
import { Item } from '../items/item.model';
import { ItemsService } from '../items/items.service';
@Injectable()
export class PlayersService {
constructor(
@InjectModel(Player) private readonly playerModel: ModelType<Player>,
private readonly itemsService: ItemsService){}
我收到这个嵌套错误:
[Nest] 11592 - 2018-8-13 11:42:17 [ExceptionHandler] Nest can't
resolve dependencies of the PlayersService (+, ?). Please make sure
that the argument at index [1] is available in the current context.
两个模块都在 app.module.ts
中导入。这两项服务都在各自的模块中单独工作。
您必须导出提供它的模块中的ItemsService
:
@Module({
controllers: [ItemsController],
providers: [ItemsService],
exports: [ItemsService]
^^^^^^^^^^^^^^^^^^^^^^^
})
export class ItemsModule {}
然后在使用服务的模块中导入导出的模块:
@Module({
controllers: [PlayersController],
providers: [PlayersService],
imports: [ItemsModule]
^^^^^^^^^^^^^^^^^^^^^^
})
export class PlayersModule {}
⚠️不要将同一个提供者添加到多个模块。导出提供者,导入模块。 ⚠️
我相信你遇到了和我一样的问题。我的场景是需要使用彼此服务的 2 个同级自定义模块(用户、身份验证)。我用循环DI解决了。请检查此 link
如果它解决了您的问题,请告诉我,也许我可以为您提供进一步的建议。
我通过从传递导出服务的构造函数的参数中删除 @Inject()
解决了我的问题。
通过更改我的提供商的@Inject()) 中使用的常量字符串 (TOKEN) 的导入方式解决了我的问题...小心使用 index.ts whith export * from module.ts , nest 不会解析 dependecy
假设您想在我的 TaskModule 的控制器中使用来自 AuthModule 的 AuthService
为此,您需要从 AuthModule
导出 authService
@Module({
imports: [
....
],
providers: [AuthService],
controllers: [AuthController],
exports:[AuthService]
})
export class AuthModule {}
然后在TaskModule中,需要导入AuthModule(注意:导入AuthModule不是TaskModule中的AuthService)
@Module({
imports:[
AuthModule
],
controllers: [TasksController],
providers: [TasksService]
})
export class TasksModule {}
现在您应该可以在 TaskController 中使用 DI
@Controller('tasks')
export class TasksController {
constructor(private authService: AuthService) {}
...
}
根据 Kim Kern 现在的回答,我们应该只将注入服务添加到我们的服务中,而不需要任何装饰器(@Inject() 不需要)。之后它将正常工作。那是我的错误,可能可以帮助其他人。
Kim Kern 回答了这个问题。但我只是想提醒阅读此评论的人。每当您遇到此错误时,您应该按照以下步骤操作,这些步骤可能会帮助您轻松找出卡住的位置:
- 确保提供提供程序的模块已导入。
- 确保您使用的提供商已导出。
例如,您有包含类别服务的类别模块,post 模块有 post 服务,并且它有类别服务作为依赖项:
@Module({
controllers: [CategoryController],
providers: [CategoryService],
exports: [CategoryService] // Remember to export
})
export class CategoryModule {}
和
@Module({
imports: [CategoryModule], // Make sure you imported the module you are using
controllers: [PostController],
providers: [PostService]
})
export class PostModule {}
不要忘记使用这个注释。
Nest 使用它来检测单例 class。
在spring boot - Java中,这个曾经被称为Bean。阅读更多:
@Injectable()
export class PostService {
constructor(private readonly categoryService: CategoryService // This will be auto injected by Nestjs Injector) {}
}
我有一个 PlayersModule
和一个 ItemsModule
。
我想在PlayersService
中使用ItemsService
。
当我注入时:
import { Injectable } from '@nestjs/common';
import { InjectModel } from 'nestjs-typegoose';
import { ModelType, Ref } from 'typegoose';
import { Player } from './player.model';
import { Item } from '../items/item.model';
import { ItemsService } from '../items/items.service';
@Injectable()
export class PlayersService {
constructor(
@InjectModel(Player) private readonly playerModel: ModelType<Player>,
private readonly itemsService: ItemsService){}
我收到这个嵌套错误:
[Nest] 11592 - 2018-8-13 11:42:17 [ExceptionHandler] Nest can't resolve dependencies of the PlayersService (+, ?). Please make sure that the argument at index [1] is available in the current context.
两个模块都在 app.module.ts
中导入。这两项服务都在各自的模块中单独工作。
您必须导出提供它的模块中的ItemsService
:
@Module({
controllers: [ItemsController],
providers: [ItemsService],
exports: [ItemsService]
^^^^^^^^^^^^^^^^^^^^^^^
})
export class ItemsModule {}
然后在使用服务的模块中导入导出的模块:
@Module({
controllers: [PlayersController],
providers: [PlayersService],
imports: [ItemsModule]
^^^^^^^^^^^^^^^^^^^^^^
})
export class PlayersModule {}
⚠️不要将同一个提供者添加到多个模块。导出提供者,导入模块。 ⚠️
我相信你遇到了和我一样的问题。我的场景是需要使用彼此服务的 2 个同级自定义模块(用户、身份验证)。我用循环DI解决了。请检查此 link
如果它解决了您的问题,请告诉我,也许我可以为您提供进一步的建议。
我通过从传递导出服务的构造函数的参数中删除 @Inject()
解决了我的问题。
通过更改我的提供商的@Inject()) 中使用的常量字符串 (TOKEN) 的导入方式解决了我的问题...小心使用 index.ts whith export * from module.ts , nest 不会解析 dependecy
假设您想在我的 TaskModule 的控制器中使用来自 AuthModule 的 AuthService
为此,您需要从 AuthModule
导出 authService@Module({
imports: [
....
],
providers: [AuthService],
controllers: [AuthController],
exports:[AuthService]
})
export class AuthModule {}
然后在TaskModule中,需要导入AuthModule(注意:导入AuthModule不是TaskModule中的AuthService)
@Module({
imports:[
AuthModule
],
controllers: [TasksController],
providers: [TasksService]
})
export class TasksModule {}
现在您应该可以在 TaskController 中使用 DI
@Controller('tasks')
export class TasksController {
constructor(private authService: AuthService) {}
...
}
根据 Kim Kern 现在的回答,我们应该只将注入服务添加到我们的服务中,而不需要任何装饰器(@Inject() 不需要)。之后它将正常工作。那是我的错误,可能可以帮助其他人。
Kim Kern 回答了这个问题。但我只是想提醒阅读此评论的人。每当您遇到此错误时,您应该按照以下步骤操作,这些步骤可能会帮助您轻松找出卡住的位置:
- 确保提供提供程序的模块已导入。
- 确保您使用的提供商已导出。
例如,您有包含类别服务的类别模块,post 模块有 post 服务,并且它有类别服务作为依赖项:
@Module({
controllers: [CategoryController],
providers: [CategoryService],
exports: [CategoryService] // Remember to export
})
export class CategoryModule {}
和
@Module({
imports: [CategoryModule], // Make sure you imported the module you are using
controllers: [PostController],
providers: [PostService]
})
export class PostModule {}
不要忘记使用这个注释。 Nest 使用它来检测单例 class。 在spring boot - Java中,这个曾经被称为Bean。阅读更多:
@Injectable()
export class PostService {
constructor(private readonly categoryService: CategoryService // This will be auto injected by Nestjs Injector) {}
}