控制器普通方法无法访问userService,箭头函数正常,求解决方案
问题解决:普通类方法中
this.userService访问失败的问题 你遇到的核心问题确实是**this关键字的绑定丢失**:当你把普通类方法this.userController.register直接传递给路由时,方法的this上下文不再指向控制器实例,导致访问this.userService时报错Cannot read properties of undefined (reading 'userService')。以下是几种无需改用箭头函数的解决方案:
方案1:路由绑定手动绑定this
在配置路由时,使用bind()方法强制将this绑定到控制器实例:
this.router.post('/register', this.userController.register.bind(this.userController));
bind()会返回一个新函数,始终将this指向传入的控制器实例,确保方法内部能正确访问userService。
方案2:构造函数中提前绑定方法
在控制器的构造函数里完成一次this绑定,后续所有调用都会保留正确的上下文:
import { inject } from 'inversify'; import { UserService } from './user.service'; export class UserController { constructor(@inject(UserService) private userService: UserService) { // 提前绑定register方法的this指向 this.register = this.register.bind(this); } public async register(req: Request, res: Response, next: NextFunction): Promise<Response | void> { try { const registerDTO: RegisterDTO = req.body; const user = await this.userService.register(registerDTO); return res.status(201).json({ message: 'user created successfully.' }); } catch (error) { next(error); } } }
之后路由配置可以保持原样:
this.router.post('/register', this.userController.register);
方案3:使用Inversify Express工具自动处理绑定
如果你使用inversify-express-utils库,可以通过装饰器自动管理this绑定,无需手动处理:
import { Controller, Post, Request, Response, Next, inject } from 'inversify-express-utils'; import { UserService } from './user.service'; @Controller('/users') export class UserController { constructor(@inject(UserService) private userService: UserService) {} @Post('/register') public async register( @Request() req: Request, @Response() res: Response, @Next() next: NextFunction ): Promise<Response | void> { try { const registerDTO: RegisterDTO = req.body; const user = await this.userService.register(registerDTO); return res.status(201).json({ message: 'user created successfully.' }); } catch (error) { next(error); } } }
这种方式下,框架会自动处理方法的this绑定,你只需专注业务逻辑即可。
内容的提问来源于stack exchange,提问作者user21009184
相关产品推荐
相关产品推荐

