【问题标题】:Nest JS unable to inject service into guard if used in module如果在模块中使用,Nest JS 无法将服务注入警卫
【发布时间】:2018-08-16 02:09:30
【问题描述】:

我创建了基本的 AuthGuard,但无法注入 TokenService。我收到此错误:

错误:Nest 无法解析 AuthGuard (?) 的依赖关系。请验证 [0] 参数在当前上下文中是否可用。

app.module.ts:

@Module({
    modules: [
        WorkModule,
    ],
    components: [TokenService],
})

export class ApplicationModule { }

auth.guard.ts:

@Guard()
export class AuthGuard implements CanActivate {
    constructor(
        private readonly tokenService: TokenService,
    ) { }
    public canActivate(dataOrRequest, context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
        return true;
    }
}

work.module.ts:

@Module({
    controllers: [WorkController],
    components: [WorkService],
})
export class WorkModule { }

更新,work.service.ts

import { Component, Inject, HttpStatus, HttpException } from '@nestjs/common';
const dataStore = require('nedb');
const workDB = new dataStore({ filename: '../db/work.db', autoload: true });
import * as moment from 'moment';
import { WorkDay, WorkDayDTO } from './work.model';
import { WorkHelpers } from './work.helpers';

@Component()
export class WorkService {
    public async getWorkGraphic(month: number, year: number) {
        return new Promise((resolve, reject) => {
            // logic here
        });
    }

    public async addOrUpdateWorkDay(day: WorkDayDTO) {
        return new Promise((resolve, reject) => {
            // logic here
        });
    }

    public async removeWorkDay(workDayId: string) {
        return new Promise((resolve, reject) => {
            // logic here
        });
    }
}

但使用此配置一切正常:

@Module({
    controllers: [
        WorkController,
    ],
    components: [TokenService, WorkService],
})

export class ApplicationModule { }

究竟是什么导致了这个错误,我怎样才能让它与第一个解决方案(模块)一起工作?

【问题讨论】:

  • 你能告诉我们你在哪里使用警卫吗?另外,第二个解决方案有效的原因是因为AuthGuard 依赖于TokenService,所以你需要以某种方式提供它(它需要添加到components
  • @Mentos1386 用作:@Get() @UseGuards(AuthGuard) public async getWorkGraphic() { ... } - 在控制器中。我发现的另一个解决方案是在注册 TokenService 的地方创建 SharedModule 并将这个 SharedModule 导入每个模块(例如 WorkModule)。

标签: node.js nestjs


【解决方案1】:

可以展示你的TokenService和WorkerService吗?

您应该始终在您的组件中注册两者以在所有应用程序范围内使用。

如果您在特定模块中使用并尝试在另一个模块中使用,您可能无法使用。

另一种情况。想象一下,如果您在 A 模块中注册了 A 组件,在 B 模块中注册了 B 组件,并想象如果您尝试在 B 模块中使用 A 组件,除非您在应用程序模块中注册或在 B 模块中的 A 组件中注册,否则您不能这样做(不要那样做,只应在所有范围内使用共享服务,这只是架构概述)。

【讨论】:

  • 按照您的要求添加了 WorkService。
猜你喜欢
  • 2019-03-22
  • 2022-01-19
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
  • 2019-12-26
  • 2021-07-17
相关资源
最近更新 更多