简体   繁体   中英

Nest JS unable to inject service into guard if used in module

I created basic AuthGuard, but can't inject TokenService. I am getting this error:

Error: Nest can't resolve dependencies of the AuthGuard (?). Please verify whether [0] argument is available in the current context.

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

Update, 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
        });
    }
}

But with this configuration everything is working:

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

export class ApplicationModule { }

What exactly is causing this error and how can I get it work with 1st solution (Modules) ?

Is possible to show your TokenService and WorkerService?

You should register both always in your components to use inside all of application scope.

If you are using inside a specific module and trying to use in another module, probably you will not be able.

Another scenario. Imagine if you have A component registered in A module, B component registered in B module and imagine if ure trying to use A component inside of B module, you cant do that unless you register in Application Module or register inside A component inside B module(dont do that, only shared services should be used in all of the scopes, is just an architecture overview).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM