Express+TypeScript报Cannot read property 'userService' of undefined如何解决
错误原因
当你直接将类的实例方法userCont.findAll作为回调传入Express的路由方法时,Express触发回调会改变this指向,导致findAll方法内部的this不再指向UserController的实例,而是undefined,所以读取this.userService时抛出了类型错误。同时你的异步路由没有捕获错误,所以附带抛出了未处理Promise拒绝的警告。
修复方案
你可以任选以下任一方式修复指向问题:
- 方案1:绑定实例this到方法
修改server文件里的路由注册代码:
app.get('/', userCont.findAll.bind(userCont))
- 方案2:用箭头函数包裹路由调用
修改server文件里的路由注册代码:
app.get('/', (req, res) => userCont.findAll(req, res))
- 方案3:将Controller的方法定义为箭头函数
修改UserController的findAll方法定义:
public findAll = async (req:Request, res:Response) => { const allUser = await this.userService.findAll() res.send(allUser) }
额外优化建议
建议给异步路由添加try/catch捕获异常,避免再次出现未处理Promise拒绝的警告:
public async findAll(req:Request, res:Response){ try { const allUser = await this.userService.findAll() res.send(allUser) } catch (err) { res.status(500).send({ message: '查询用户失败', error: err }) } }
内容的提问来源于stack exchange,提问作者jenkem
相关产品推荐
相关产品推荐

