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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:36:02