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
相关产品推荐
相关产品推荐

