TypeError: 无法读取undefined的userService属性问题求助
解决TypeError: Cannot read properties of undefined (reading 'userService')问题
你遇到的这个错误,核心原因是Express路由绑定方法时丢失了this上下文。当你把this.getCases直接传给router.get()时,这个方法的this不再指向ServicecenterController的实例,导致访问this.userService时出现undefined。
下面是三种可行的解决方法:
方案1:在构造函数中绑定this
在控制器的构造函数里,给需要绑定到路由的方法手动绑定this,确保方法执行时的上下文是控制器实例:
export class ServicecenterController { private userService: UserService private router: Router // 假设你已声明router实例 constructor(...) { ... this.userService = new UserService() // 绑定方法的this到当前实例 this.getCases = this.getCases.bind(this) this.getLatestCases = this.getLatestCases.bind(this) this.createCase = this.createCase.bind(this) this.initRoutes() } private initRoutes(){ this.router.get('/', this.validationService.validateRequest('getDevices'), this.getCases) this.router.get('/latest', this.validationService.validateRequest('getDevices'), this.getLatestCases) this.router.post('/create', this.createCase) } // 原getCases方法 private async getCases(req, res, next) { const email = ... // 从请求中获取email const userOrgs = this.userService.getUserOrgsByEmail(email) // 后续业务逻辑 } }
方案2:路由绑定用箭头函数包裹
在initRoutes里,用箭头函数包裹要绑定的方法,箭头函数会自动继承外层的this(即控制器实例):
private initRoutes(){ this.router.get('/', this.validationService.validateRequest('getDevices'), (req, res, next) => this.getCases(req, res, next)) this.router.get('/latest', this.validationService.validateRequest('getDevices'), (req, res, next) => this.getLatestCases(req, res, next)) this.router.post('/create', (req, res, next) => this.createCase(req, res, next)) }
方案3:将方法定义为箭头函数
直接把控制器里的方法定义成类属性箭头函数,这样方法的this会永久绑定到控制器实例,不需要额外绑定:
export class ServicecenterController { private userService: UserService private router: Router constructor(...) { ... this.userService = new UserService() this.initRoutes() } private initRoutes(){ this.router.get('/', this.validationService.validateRequest('getDevices'), this.getCases) this.router.get('/latest', this.validationService.validateRequest('getDevices'), this.getLatestCases) this.router.post('/create', this.createCase) } // 用箭头函数定义方法 private getCases = async (req, res, next) => { const email = ... const userOrgs = this.userService.getUserOrgsByEmail(email) // 后续业务逻辑 } private getLatestCases = async (req, res, next) => { // 方法逻辑 } private createCase = async (req, res, next) => { // 方法逻辑 } }
内容的提问来源于stack exchange,提问作者linusum
相关产品推荐
相关产品推荐

