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

TypeScript中TypeError: Cannot read properties of undefined问题修复指引

问题原因

核心是**this指向丢失**:当LoginController的login方法被作为Express路由处理函数使用时,Express内部调用该方法时没有绑定类实例的上下文,导致方法内的this变为undefined,因此无法读取this.JWT属性。

修复方案

提供三种可靠的修复方式,任选其一即可:

方案1:用箭头函数定义login方法

箭头函数会自动捕获类实例的this,避免上下文丢失:

import JWT from "../Utils/JWT"
import { Request, Response } from 'express'

class LoginController{
    private JWT = new JWT();
    
    // 改为箭头函数
    public login = (req:Request, res:Response) => {
        const payload = {
            id:1,
            account:'eulaoshi'
        } 

        const token = this.JWT.createJWT(payload)
        console.log(token)
        
        res.json({ token })
    }
}
export default LoginController

方案2:路由注册时绑定this

在配置路由的位置,手动将login方法绑定到类实例:

// 路由注册示例
import LoginController from './Controllers/LoginController';
import express from 'express';
const app = express();

const loginController = new LoginController();
// 绑定实例到方法,确保this指向正确
app.post('/login', loginController.login.bind(loginController));

方案3:构造函数内绑定this

在LoginController的构造函数中,提前将login方法的this绑定到当前实例:

import JWT from "../Utils/JWT"
import { Request, Response } from 'express'

class LoginController{
    private JWT = new JWT();
    
    constructor() {
        // 绑定this到实例
        this.login = this.login.bind(this);
    }
    
    public login(req:Request, res:Response){
        const payload = {
            id:1,
            account:'eulaoshi'
        } 

        const token = this.JWT.createJWT(payload)
        console.log(token)
        
        res.json({ token })
    }
}
export default LoginController

额外修正:原代码中res.json里的"this.JWT.createJWT(payload)"是字符串字面量,会直接返回该文本而非生成的token,修复时需改为调用方法的实际结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:40:01