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

TypeScript使用mongoose开发时报Cannot read property 'insertOnMatch' of undefined错误

错误原因
  • 核心问题是this上下文丢失:你在create方法中调用this.insertOnMatch时,this的值为undefined,因此无法读取该方法。
  • 该问题通常出现在将类的create方法直接作为Express路由回调传递的场景:Express执行回调时会默认将执行上下文绑定到路由对象或全局对象,不会指向你定义的类实例,导致this指向失效。
解决方案

你可以任选以下任意一种方式修复:

  1. 路由注册时手动绑定this指向
    用bind方法手动将create方法的执行上下文绑定到类实例,示例:
// 原路由注册代码
// app.post('/player', playerController.create)
// 修改为
app.post('/player', playerController.create.bind(playerController))
  1. 将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)
}
  1. 路由回调处用匿名函数包裹调用
    注册路由时不直接传递类方法,而是包一层箭头函数内部调用实例方法:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:00:05