NodeJS中构造函数传Model给父类后调用方法报MODEL未定义如何解决
问题原因
错误的核心是this上下文丢失:你直接将UserController.index、UserController.store作为express路由的回调函数传入时,express触发回调时是脱离UserController实例独立调用方法的,此时方法内部的this指向不是你实例化的Users对象,而是undefined(ES6类的方法默认开启严格模式,未被实例调用时this为undefined),因此访问this.MODEL就会抛出Cannot read property 'MODEL' of undefined的错误。
解决方案
有三种常用修复方式,任选其一即可:
- 方案1:路由注册时手动绑定this上下文
路由文件中注册路由时,用bind方法将方法的this绑定到UserController实例:routerApi.get("/user", UserController.index.bind(UserController)); routerApi.post("/user", UserController.store.bind(UserController)); - 方案2:用匿名箭头函数包裹方法调用
利用箭头函数继承外层this的特性,保证方法调用时主体为UserController实例:routerApi.get("/user", (req, res) => UserController.index(req, res)); routerApi.post("/user", (req, res) => UserController.store(req, res)); - 方案3:类内部定义方法时预先绑定this
直接修改Controller基类,将方法定义为类字段箭头函数,实例化后方法的this会永久绑定到实例本身,无需在调用侧额外处理:class Controller{ constructor(_model){ this.MODEL = _model; } store = async (req, res) => { try { const data = await this.MODEL.create(req.body); return res.json(data); } catch (error) { return res.json({ status: "error", message: error.message, }); } } index = async (req, res) => { try { const data = await this.MODEL.findAll(); return res.json(data); } catch (error) { return res.json({ status: "error", message: error.message, }); } } }
内容的提问来源于stack exchange,提问作者Crazy
相关产品推荐
相关产品推荐

