Inject nestjs service from another module

I've got a PlayersModule and an ItemsModule.

I want to use the ItemsService in the PlayersService.

When I add it by injection:

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){}

I get this nest error :

[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.

Both modules are imported in the app.module.ts. Both services are working alone in their module.

99176 次浏览

你必须在提供 ItemsService的模块中使用 出口:

@Module({
controllers: [ItemsController],
providers: [ItemsService],
exports: [ItemsService]
^^^^^^^^^^^^^^^^^^^^^^^
})
export class ItemsModule {}

然后在使用该服务的模块中导入导出的 module:

@Module({
controllers: [PlayersController],
providers: [PlayersService],
imports: [ItemsModule]
^^^^^^^^^^^^^^^^^^^^^^
})
export class PlayersModule {}

⚠️ Don't add the same provider to multiple modules. Export the provider, import the module. ⚠️

我相信你和我面临着同样的问题。我的场景是两个兄弟自定义模块(用户、认证) ,它们需要使用彼此的服务。我用 循环 DI解出来的。请检查这个 链接

让我知道如果它解决了你的问题,也许我可以进一步建议你。

通过从传递导出服务的构造函数中的参数中删除 @Inject(),我解决了这个问题。

通过改变导入提供程序@Inject ()中使用的常量字符串(TOKEN)的方式解决了我的问题... ... 小心使用 index.ts,从 module.ts 导出 * ,nest 不会解决依赖性问题

假设您希望在我的 TaskModule 的控制器中使用 AuthService from AuthModule

为此,需要从 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 {}

Now you should be able to use DI in TaskController

@Controller('tasks')
export class TasksController {
constructor(private authService: AuthService) {}
...
}
  

基于 Kim Kern 的答案,我们现在应该只在服务中添加注入的服务,而不需要任何装饰器(@Inject ()不需要)。之后,它将工作的权利。那是我的错,也许可以帮助别人。

这个问题由 Kim Kern 回答。但是我想提醒那些读过这条评论的人。无论何时你遇到这个错误,你都应该遵循以下步骤,这些步骤可以帮助你很容易地找到卡住的地方:

  • 确保导入了提供提供程序的模块。
  • 确保导出了您正在使用的提供程序。

例如,你有类别模块,它包含类别服务,邮政模块有邮政服务,它有类别服务作为一个依赖:

@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 使用它来检测单例类。 在 Spring boot-Java 中,这个过去被称为 Bean:

@Injectable()
export class PostService {
constructor(private readonly categoryService: CategoryService // This will be auto injected by Nestjs Injector) {}
}