AdonisJS v6中LoginController构造依赖注入失败问题求助
问题解决方法
核心问题
你把@inject装饰器用错了位置:构造函数注入需要给构造函数加@inject,而不是方法。容器无法解析LoginController的依赖,就是因为它的构造函数没有被标记为需要注入。
修正LoginController代码
import { inject } from '@adonisjs/core/build/standalone' import AuthService from 'path/to/auth-service' // 替换成你的实际路径 @inject() export default class LoginController { constructor(protected authService: AuthService) {} doLogin({ request }) { return this.authService.doLogin(request) } }
也可以给构造函数单独加@inject:
import { inject } from '@adonisjs/core/build/standalone' import AuthService from 'path/to/auth-service' export default class LoginController { @inject() constructor(protected authService: AuthService) {} doLogin({ request }) { return this.authService.doLogin(request) } }
修正AuthService代码
给它的构造函数加@inject,并移除方法上无用的@inject:
import { inject } from '@adonisjs/core/build/standalone' import UserRepositoryInterface from 'path/to/user-repository-interface' export default class AuthService { @inject() constructor(private userRepository: UserRepositoryInterface) {} // login user async doLogin(request: any) { const { email, password } = request.only(['email', 'password']) try { // get user by email const user = await this.userRepository.getByEmail(email) if (!user) { // 你的业务逻辑 } else { if (user.active === StatusEnum.ACTIVE) { const userLogin = this.userRepository.verifyCredentials(email, password) if (await userLogin) { const token = this.userRepository.createToken(user) const response = { token: token, } // 你的业务逻辑 } else { // 你的业务逻辑 } } else { // 你的业务逻辑 } } } catch (error) { // 你的业务逻辑 } } }
额外检查
确保UserRepositoryInterface已经在AdonisJS容器中绑定了具体实现类。比如在start/app.ts的providers里注册对应的Provider,或者在Provider中通过container.bind绑定接口到实现:
// 示例:在自定义Provider中 import { ApplicationContract } from '@ioc:Adonis/Core/Application' import UserRepositoryInterface from 'path/to/user-repository-interface' import UserRepository from 'path/to/user-repository' export default class AppProvider { constructor(protected app: ApplicationContract) {} public register() { this.app.container.bind(UserRepositoryInterface, () => { return new UserRepository() }) } }
内容的提问来源于stack exchange,提问作者Tojo
相关产品推荐
相关产品推荐

