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

TypeScript类成员函数返回另一个函数的技术问题咨询

问题分析与修复方案

首先看你的代码,核心问题出在init方法返回的普通函数里的this指向不对。当Express调用这个中间件函数时,this的上下文并不是你的AccessTokenMiddleWare实例,而是Express内部的上下文对象,这就导致调用this.addJwtToReqBody时会报错——因为这个方法是类的私有方法,只有实例上才有,而此时的this根本不是你的类实例。

下面给你几种可行的修复方案:

方案1:使用箭头函数绑定上下文

箭头函数会继承外层作用域的this,也就是init方法执行时的类实例,这样就能正确调用addJwtToReqBody了:

import {Request, Response, Router} from 'express';
import {IAccessTokenMiddleWare} from "./IAccessTokenMiddleWare";

class AccessTokenMiddleWare implements IAccessTokenMiddleWare {
    private jwtToken: string;
    constructor() {
        this.jwtToken = "";
    }
    public init() : any {
        // 改用箭头函数,继承外层的this(类实例)
        return (req: Request, res: Response, next: any) => {
            this.addJwtToReqBody(req);
            next(); // 别忘了调用next,否则请求会挂起
        }
    }
    private addJwtToReqBody(req: Request) {
        console.log("ADDED...")
        // 这里可以处理req,比如把jwtToken加到req.body里
        req.body.jwtToken = this.jwtToken;
    }
}
export {AccessTokenMiddleWare}

方案2:手动绑定this到类实例

如果坚持要用普通函数,可以用bind方法把函数的this绑定到类实例:

public init() : any {
    return function (req: Request, res: Response, next: any) {
        this.addJwtToReqBody(req);
        next();
    }.bind(this); // 绑定this为类实例
}

方案3:保存this到变量

在init方法里先把实例的this存到一个变量(比如self),然后在普通函数里用这个变量调用方法:

public init() : any {
    const self = this; // 保存实例的this
    return function (req: Request, res: Response, next: any) {
        self.addJwtToReqBody(req);
        next();
    }
}

另外还要注意:你的中间件里别忘了调用next(),否则请求会一直挂起,不会继续往后执行后续的路由处理逻辑。

内容的提问来源于stack exchange,提问作者Kiren S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:23:37