TypeScript使用mongoose开发时报Cannot read property 'insertOnMatch' of undefined错误
错误原因
- 核心问题是
this上下文丢失:你在create方法中调用this.insertOnMatch时,this的值为undefined,因此无法读取该方法。 - 该问题通常出现在将类的
create方法直接作为Express路由回调传递的场景:Express执行回调时会默认将执行上下文绑定到路由对象或全局对象,不会指向你定义的类实例,导致this指向失效。
解决方案
你可以任选以下任意一种方式修复:
- 路由注册时手动绑定this指向
用bind方法手动将create方法的执行上下文绑定到类实例,示例:
// 原路由注册代码 // app.post('/player', playerController.create) // 修改为 app.post('/player', playerController.create.bind(playerController))
- 将create方法改写为箭头函数形式
箭头函数会继承定义时外层的this上下文,不会被调用方修改,改写示例:
public create = async (req: Request, res: Response): Promise<Response> => { const newPlayerConfig = { playerId: generatedPlayerId, playerMatchRefererId: req.params.matchId } const newPlayer = await Player.create(newPlayerConfig) this.insertOnMatch(newPlayer.playerMatchRefererId, newPlayer.playerId).catch(err => { console.error(err) }) return res.json(newPlayer) }
- 路由回调处用匿名函数包裹调用
注册路由时不直接传递类方法,而是包一层箭头函数内部调用实例方法:
app.post('/player', (req, res) => playerController.create(req, res))
额外优化建议
你当前调用insertOnMatch时没有加await,如果该异步方法执行出错,即使加了catch也可能触发未处理的Promise异常提示,建议补充await关键字:
await this.insertOnMatch(newPlayer.playerMatchRefererId, newPlayer.playerId).catch(err => { console.error(err) })
内容的提问来源于stack exchange,提问作者scriptv9
相关产品推荐
相关产品推荐

