Внедрить компонент (Сервис) в другой компонент (Сервис), используя экспорт модулей
Я прочитал статью о документах nestjs об иерархической инъекции. Но у меня проблемы с его реализацией. В настоящее время у меня есть два модуля.AuthModule
это модуль, который импортирует UserModule
, UserModule
содержит сервис, который используется в других модулях (где он работает правильно).
auth.module.ts
import * as passport from 'passport';
import {
Module,
NestModule,
MiddlewaresConsumer,
RequestMethod,
} from '@nestjs/common';
import { AuthService } from './auth.service';
import {JwtStrategy} from './jwt.straegy';
import {UserModule} from '../shared/user/user.module';
@Module({
imports: [UserModule],
components: [AuthService, JwtStrategy],
exports: [AuthService]
})
export class AuthModule implements NestModule {
public configure(consumer: MiddlewaresConsumer) {
consumer
.apply(passport.authenticate('jwt', { session: false }))
.forRoutes({ path: '/cats', method: RequestMethod.ALL });
}
}
user.module.ts
import {Module} from '@nestjs/common';
import {MongooseModule} from '@nestjs/mongoose';
import {UserSchema} from '../../schema/user.schema';
import {UserService} from './user.service';
@Module({
imports: [
MongooseModule.forFeature([{ name: 'UserInterface', schema: UserSchema }])
],
components: [UserService],
exports: [UserService]
})
export class UserModule {}
Проблема возникает, когда nestjs внедряет UserService в AuthService. Следующая ошибка обнаружена. Удаление службы из конструктора работ. Странно то, что UserService работает в других модулях.
Error: Nest can't resolve dependencies of the AuthService (?). Please verify whether [0] argument is available in the current context.
auth.service.ts
import * as jwt from 'jsonwebtoken';
import { Component } from '@nestjs/common';
import {UserService} from '../shared/user/user.service';
@Component()
export class AuthService {
constructor(private readonly userService: UserService) {}
async createToken(username) {
const expiresIn = 60 * 60, secretOrKey = 'i am fake!';
const user = {username};
const token = jwt.sign(user, secretOrKey, {expiresIn});
return {
expires_in: expiresIn,
access_token: token
};
}
async validateUser(signedUser): Promise<boolean> {
return !!(await this.userService.findByUsername(signedUser.username));
}
}
1 ответ
Это странно, у меня есть почти такой же код, который работает, кажется, я заметил, я не уверен, в этом ли проблема здесь, но вы могли бы использовать authService в модуле пыльника? если это так, вам может понадобиться повторно экспортировать usersModule в authModule, чтобы в вашей текущей области он был:
в authModule:
exports: [UserModule, AuthService]
(Невозможно показать полный пример, так как stackru проснулся и неправильно подошел и не позволил мне добавить блок кода)
Если это изменение работает, вы могли бы "импортировать"(добавлен в массив компонентов) authService в другой модуль без импорта всего модуля authModule, если вы можете предоставить github repo весь код, он может быть более простым.
помните, authService теперь является частью authModule и никогда не должен добавляться непосредственно в пыльник модуля, а только через массив "import". Если это не ваш случай, вы можете предоставить github repo весь код, который может быть более легким для помощи