You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 18:02:48