Node.js中Sequelize模型调用报错:findAll不是函数
解决Sequelize模型调用时
TypeError: user.findAll is not a function的问题 错误原因
你直接导入的../models/user是模型的定义函数(接收sequelize和DataTypes参数的那个函数),不是已经初始化完成的User模型实例,自然找不到findAll这类实例方法。
正确解决方法
Sequelize项目通常会通过一个统一的入口文件(默认是models/index.js)来初始化所有模型并导出可用的实例,具体操作如下:
1. 确认/创建models/index.js文件
如果是用sequelize-cli生成的项目,这个文件默认存在,核心逻辑是初始化Sequelize连接、加载所有模型并实例化,示例代码如下:
const fs = require('fs'); const path = require('path'); const Sequelize = require('sequelize'); const basename = path.basename(__filename); const env = process.env.NODE_ENV || 'development'; const config = require(__dirname + '/../config/config.json')[env]; const db = {}; let sequelize; if (config.use_env_variable) { sequelize = new Sequelize(process.env[config.use_env_variable], config); } else { sequelize = new Sequelize(config.database, config.username, config.password, config); } // 加载并初始化所有模型文件 fs .readdirSync(__dirname) .filter(file => { return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'); }) .forEach(file => { const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes); db[model.name] = model; }); // 执行模型关联 Object.keys(db).forEach(modelName => { if (db[modelName].associate) { db[modelName].associate(db); } }); db.sequelize = sequelize; db.Sequelize = Sequelize; module.exports = db;
2. 在Service文件中正确导入模型
从models/index.js导出的对象中解构出已经初始化好的User模型,直接调用其方法即可:
const { User } = require("../models"); // 导入统一模型入口的实例 module.exports = { async listUsers(req, res) { try { const users = await User.findAll(); // 注意添加await处理异步操作 res.send(users); } catch (error) { res.status(500).send({ error: error.message }); } }, };
补充说明
如果你的项目没有自动生成models/index.js,手动创建上述文件即可——核心就是通过Sequelize实例去初始化所有模型文件,把初始化后的模型统一导出,这样其他业务文件就能直接拿到可调用的模型实例。
内容的提问来源于stack exchange,提问作者Raphael Bertoldo
相关产品推荐
相关产品推荐

