调用Sequelize内置函数报错:User.create不是函数求助
Sequelize调用User.create()报错TypeError: User.create is not a function的解决方法
问题场景
通过npx sequelize-cli init初始化Sequelize项目,User表迁移文件、模型文件及自动生成的models/index.js均配置完成,数据库迁移成功。server.js中数据库连接验证通过,但调用User.create()时触发TypeError: User.create is not a function错误,无法使用Sequelize内置方法。
错误原因
- 模型引入方式错误:直接
require("./models/User")得到的是模型的工厂函数,而非已和Sequelize实例绑定的模型对象。models/index.js已经完成了模型与Sequelize实例的关联,必须从其导出的db对象中获取模型。 - 变量未定义:server.js中使用的
sequelize变量未声明,正确引用应为db.sequelize。 - 语法不完整:server.js末尾缺少闭合的
});,导致代码执行异常。 - 迁移表名不一致:迁移文件
down方法中删除的表名是Users,但up方法创建的表名是User,回滚时会找不到对应表。
解决方案
1. 修正server.js代码
调整模型引入方式,修复未定义变量并补全语法:
const express = require("express"); const app = express(); const cors = require("cors"); const PORT = process.env.PORT || 3500; // 增加默认端口,避免环境变量未设置时出错 const db = require("./models"); // 从db对象中获取已初始化的User模型 const User = db.User; app.use(express.json()); app.use(cors()); db.sequelize.sync({force: true}).then(async () => { app.listen(PORT, () => { console.log(`Listening on port ${PORT}`); }); const newUser = { username: "abc", password: "123123", successfully_verified: false, }; try { await db.sequelize.authenticate(); console.log("Connection has been established successfully."); const user = await User.create(newUser); console.log(user); } catch (error) { console.error("Error creating user:", error); } }); // 补全闭合括号
2. 修正迁移文件的down方法
确保删除的表名与创建的表名一致:
async down(queryInterface, Sequelize) { await queryInterface.dropTable('User'); // 改为与up方法一致的表名'User' }
3. 验证执行
重新启动server.js,此时User.create()应能正常执行,成功创建用户记录并打印相关信息。
内容的提问来源于stack exchange,提问作者Sajeel Zafar
相关产品推荐
相关产品推荐

