使用模块导出将组件(服务)注入其他组件(服务)
Inject component(Service) into other component(Service) using module exports
我已经阅读了关于 hierarchical inject 的关于 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));
}
}
太奇怪了,我确实有几乎相同的代码可以工作,有人认为我注意到了,我不确定这是否是这里的问题,但您可以在另一个模块中使用 authService 吗?如果是这样,您可能需要 re-export authModule 中的 usersModule 以便您当前的范围将拥有它:
在 authModule 中:
exports: [UserModule, AuthService]
(无法显示完整的示例,因为 Whosebug 唤醒了错误的脚,不会让我添加代码块)
如果此更改有效,您可能有 "imported"(添加到组件数组)authService 到花药模块,而无需导入整个 authModule,
如果您可以提供 github 包含所有代码的回购协议,它可能会更容易。
记住,authService 现在是 authModule 的一部分,永远不应该直接添加到另一个模块,而只能通过 "import" 数组添加,如果不是你的情况,你可以提供 github repo 与所有代码可能更容易帮助
我已经阅读了关于 hierarchical inject 的关于 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));
}
}
太奇怪了,我确实有几乎相同的代码可以工作,有人认为我注意到了,我不确定这是否是这里的问题,但您可以在另一个模块中使用 authService 吗?如果是这样,您可能需要 re-export authModule 中的 usersModule 以便您当前的范围将拥有它:
在 authModule 中:
exports: [UserModule, AuthService]
(无法显示完整的示例,因为 Whosebug 唤醒了错误的脚,不会让我添加代码块)
如果此更改有效,您可能有 "imported"(添加到组件数组)authService 到花药模块,而无需导入整个 authModule, 如果您可以提供 github 包含所有代码的回购协议,它可能会更容易。
记住,authService 现在是 authModule 的一部分,永远不应该直接添加到另一个模块,而只能通过 "import" 数组添加,如果不是你的情况,你可以提供 github repo 与所有代码可能更容易帮助