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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:42:20