Node.js中“Home is not a Constructor”报错问题求助
TypeError: app.src.models.Home is not a constructor 问题 我来帮你搞定这个报错,你遇到的问题主要出在两个地方:consign的模块命名规则和模型的导出方式,咱们一步步拆解修复:
1. 先搞懂为啥报错
(1)consign是按文件名生成属性的
从你控制台输出的 { 'home.model': [Function: Home] } 就能看明白,consign会把你的模型文件名(去掉.js后缀)作为app.src.models里的键名。你的模型文件叫home.model.js,所以对应的属性是app.src.models['home.model'],而不是你代码里写的app.src.models.Home——不管是大小写还是命名格式都对不上,自然拿不到构造函数。
(2)模型导出方式错了
你当前的导出代码是:
module.exports = function () { return Home }
这意味着app.src.models['home.model']拿到的是一个返回Home类的函数,而不是Home类本身。你直接用new去调用这个函数当然会报错,得先执行这个函数才能拿到构造函数。另外你之前试过module.exports = new Home(),这也不对——你导出的是Home的实例,不是构造函数,用new去实例化一个实例肯定会失败。
2. 具体修复步骤
步骤1:修正模型的导出方式
把Home模型的导出代码改成直接导出类本身:
class Home { constructor() { console.log('Construi') } getHomeData(conexao, callback) { conexao.query('select * from tarefas', callback) } } // 直接导出Home类,不要套函数,也不要导出实例 module.exports = Home
步骤2:修正路由里的实例化代码
因为consign用文件名作为属性名,所以你需要用正确的属性名来访问构造函数。有两种方案:
方案A:用文件名对应的属性名
直接在路由里用app.src.models['home.model']来实例化:
module.exports = function (app) { app.get('/', function (req, res) { console.log("I'm on the home.js and still have data +", app.src.models) var conexao = app.src.config.db() // 这里用文件名对应的属性名 var homeData = new app.src.models['home.model'](); homeData.getHomeData(conexao, (err, result) => { if (err) { res.json(err) } else { res.json(result) } }) }); }
方案B:修改模型文件名(更推荐)
如果你想让代码更直观,把模型文件名改成Home.js,这样consign加载后,app.src.models.Home就能直接访问到这个类,路由代码不用改就能正常运行,代码可读性更高。
3. 验证修复
修改完成后重启你的Express服务,访问localhost:3000,应该就能正常查询数据库并返回结果了。
内容的提问来源于stack exchange,提问作者Tiago Silveira

