使用Awilix依赖注入时出现AwilixResolutionError: Could not resolve 'run'问题求助
Awilix注入报错:
AwilixResolutionError: Could not resolve 'run' 问题简述
使用Awilix实现依赖注入时,执行函数程序崩溃,抛出错误:AwilixResolutionError: Could not resolve 'run'
相关代码片段
依赖注入配置文件
const container = awilix.createContainer({ injectionMode: awilix.InjectionMode.PROXY, }); container.register({ userRepo: awilix.asClass(UserMock), getUserById: awilix.asClass(GetUserByIdInteractor), signin: awilix.asClass(Signin), }); export const signin: Signin = container.resolve('signin');
Signin类
// 存在语法错误 export class new Signin extends UseCase { constructor(private getUserById: GetUserById){ super() } async run(username: string, password: string) { // some code } }
GetUserById类
// 存在语法错误 export class new GetUserById { constructor(private userRepo: UserRepository){ super() } async run(id: string) { // some code } }
UserRepository接口
export interface UserRepository { getById(id: string): Promise<User> }
UserMock实现类
// 存在语法错误 export UserMock implements UserRepository { getById(id: string){ //some code } }
GraphQL解析器
export class SigninResolver { async signin(@Arg('data', () => SigninInput){ const res = signin(data.username, data.password); return res; } }
解决方案
修复类定义的语法错误
- Signin和GetUserById类的
export class new是无效语法,需删除new,改为export class Signin和export class GetUserById - UserMock类缺少
class关键字,正确写法为export class UserMock implements UserRepository
- Signin和GetUserById类的
确保依赖注册与构造参数名匹配
Awilix默认按参数名注入依赖,当前注册getUserById时使用的类是GetUserByIdInteractor,但Signin构造函数依赖的类型是GetUserById,二者需保持一致:- 要么将注册项改为
getUserById: awilix.asClass(GetUserById) - 要么将Signin构造函数的参数名改为
getUserByIdInteractor,同时注册key对应改为getUserByIdInteractor
- 要么将注册项改为
修正实例调用方式
解析器中直接调用signin(...)是错误的,signin是Signin类的实例,需调用其run方法;且run是异步方法,必须加await:async signin(@Arg('data', () => SigninInput) data) { const res = await signin.run(data.username, data.password); return res; }
内容的提问来源于stack exchange,提问作者Jhonatan Malara
相关产品推荐
相关产品推荐

