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

路由直接绑定handle方法时createUserUseCase为null的原因咨询

问题原因:this上下文绑定丢失

核心问题是JavaScript/TypeScript中的方法this绑定规则导致的:

直接传createUserFactory().handle失效的原因

当你把createUserFactory().handle作为回调函数传给userRouter.post时,你只是把handle方法本身的引用传递了过去,此时这个方法的this上下文不再指向原来的CreateUserController实例。在TypeScript默认启用的严格模式下,这种情况里this会变成undefined,导致你在handle方法中访问this.createUserUseCase时,得到的就是undefined(表现为你看到的null)。

箭头函数包裹能正常运行的原因

箭头函数不会绑定自己的this,它会继承外层作用域的this。更关键的是,在箭头函数内部你是通过createUserFactory().handle(req, res)的形式调用方法——也就是通过controller实例来调用handle方法,此时根据JavaScript的调用规则,方法内部的this会自动指向调用它的实例,所以能正确访问到createUserUseCase。

两种可行的解决方案

方案1:在构造函数中手动绑定this

修改CreateUserController的构造函数,把handle方法的this绑定到实例:

class CreateUserController {
  private createUserUseCase: CreateUserUseCase;

  constructor(useCase: CreateUserUseCase) {
    this.createUserUseCase = useCase;
    // 将handle方法的this绑定到当前实例
    this.handle = this.handle.bind(this);
  }

  handle(req: Request, res: Response) {
    // 这里的this会始终指向CreateUserController实例
    this.createUserUseCase.execute(/* ... */);
  }
}

方案2:使用类字段箭头函数

把handle定义为类字段箭头函数,它会自动绑定实例的this:

class CreateUserController {
  private createUserUseCase: CreateUserUseCase;

  constructor(useCase: CreateUserUseCase) {
    this.createUserUseCase = useCase;
  }

  // 箭头函数自动绑定this到当前实例
  handle = (req: Request, res: Response) => {
    this.createUserUseCase.execute(/* ... */);
  }
}

内容的提问来源于stack exchange,提问作者Guilherme Kauã

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:42:15