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

将类方法传入Express中间件时this指向异常致属性未定义

解决Express路由中类方法this指向丢失问题

问题根源在于:当你把orderController.createOrder直接作为路由处理函数传递时,这个方法的this绑定会丢失,调用时this不再指向orderController实例,导致this.orderModel变成undefined。

下面是三种可行的解决办法:

1. 在路由中用bind绑定this

直接在注册路由时,通过bind方法把this强制绑定到orderController实例上:

import { Router } from "express";
import { OrderController } from "../../controller/orders.controller";
export const orderRouter = Router();

const orderController = new OrderController();
// 用bind绑定this到实例
orderRouter.post("/", orderController.createOrder.bind(orderController));

2. 在类的构造函数中提前绑定this

在OrderController的构造函数里,把createOrder方法的this绑定到当前实例,后续传递方法时就不会丢失绑定:

import { OrderModel } from "../database/model/order.model";

export class OrderController {
  orderModel: OrderModel;

  constructor() {
    this.orderModel = new OrderModel();
    // 提前绑定this到实例
    this.createOrder = this.createOrder.bind(this);
  }

  async createOrder(req: Request, res: Response, next: NextFunction) {
    const newOrder = ...

    ...

    const order = await this.orderModel.save(newOrder);

    res.json(order);
  }
}

这种方式下,路由代码不需要做任何修改。

3. 用箭头函数定义类方法

箭头函数的this遵循词法作用域,会自动绑定到类的实例上,所以直接用箭头函数定义createOrder方法即可:

import { OrderModel } from "../database/model/order.model";

export class OrderController {
  orderModel: OrderModel;

  constructor() {
    this.orderModel = new OrderModel();
  }

  // 用箭头函数定义方法,自动绑定this
  async createOrder = (req: Request, res: Response, next: NextFunction) => {
    const newOrder = ...

    ...

    const order = await this.orderModel.save(newOrder);

    res.json(order);
  }
}

这种方式同样不需要修改路由代码,写法更简洁。

内容的提问来源于stack exchange,提问作者Thanos Sakis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 09:01:12