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

TypeScript实验性方法装饰器致类实例this指向undefined的问题修复

问题原因

你编写的装饰器在调用原控制器方法时,错误地将this绑定到了装饰器接收的scope参数(类的原型对象),而非实际的控制器实例。当Express执行路由处理方法时,原方法的this上下文被强制替换,导致无法找到实例上的generateUserResponse方法,最终抛出错误。

修复方案

修改装饰器中调用原方法的逻辑,使用当前执行上下文的this(即控制器实例)来绑定原方法的上下文,而非scope参数:

export function ValidateRequestAsync(schema: joi.ObjectSchema) {
  return function (
    scope: unknown,
    methodName: string,
    descriptor: PropertyDescriptor
  ) {
    const originalMethod = descriptor.value;

    descriptor.value = async function (
      req: Request,
      res: Response,
      ...args: unknown[]
    ) {
      try {
        await validateRequestAsync(schema, req.body);
      } catch (e) {
        if (e instanceof joi.ValidationError) {
          return validationErrorResponse(res, resolveValidationError(e));
        }
      }

      // 用当前函数的this(控制器实例)绑定原方法的上下文
      return originalMethod.apply(this, [req, res, ...args]);
    };
  };
}
额外注意事项

如果你的路由注册方式是直接引用类的原型方法(比如router.post('/register', AuthController.register)),即使修复装饰器,this依然会是undefined——因为此时方法没有绑定到任何实例。这种情况下,你需要确保路由使用控制器实例的方法:

const authController = new AuthController();
router.post('/register', authController.register);

内容的提问来源于stack exchange,提问作者Wai Yan Hein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 06:12:32