Node/Sequelize调用findAll报undefined属性读取错误排查
问题解答
关于报错指向的属性:
报错TypeError: Cannot read property 'findAll' of undefined出在第45行的EtlFile.findAll调用,这里读不到的属性是findAll,但核心问题是调用findAll的EtlFile变量值为undefined。JS里执行X.Y操作时,如果X本身是undefined,就会抛出这类错误,说明你前面写的const EtlFile = db.etl_file根本没拿到合法的Sequelize模型实例。关于模型引入写法的问题:
const EtlFile = db.etl_file写得对不对,和数据库表名叫etl_file没有直接关系,不需要强行和表名命名一致:- 数据库表名是模型和数据库层映射的配置,是定义模型时通过
tableName参数指定、或者按Sequelize默认命名规则自动生成的,和db对象上挂载模型的属性名完全是两回事。 - db对象上的模型属性名,完全取决于
../models目录下的导出逻辑。如果是用Sequelize CLI自动生成的models/index.js脚本,默认会把模型名转成小驼峰格式挂载,对应etl_file表的模型默认挂载的key通常是etlFile,你写db.etl_file自然拿不到值,返回undefined。 - 最快的定位方法:在controller开头加一行
console.log(Object.keys(db)),启动服务后看控制台打印的db对象所有属性,找到对应etl_file业务的模型key,替换掉EtlFile赋值语句里的属性名就行。如果属性列表里根本找不到对应模型,去检查models目录下的模型定义文件、index.js的模型注册逻辑有没有写错。
- 数据库表名是模型和数据库层映射的配置,是定义模型时通过
内容的提问来源于stack exchange,提问作者troll
相关产品推荐
相关产品推荐

