使用Sequelize提交表单数据至MySQL时遇'Cannot read property 'create' of undefined'错误
Cannot read property 'create' of undefined错误 这个错误的核心原因很明确:你代码里的db.orders是undefined,也就是说你的Orders模型并没有被正确挂载到db对象上,或者你引用模型的名称不对。结合你提供的代码,我来一步步帮你排查解决:
1. 先修正模型引用的大小写问题
看你的orders.js文件,模型定义时用的是首字母大写的"Orders":
var Orders = sequelize.define("Orders", { // 字段定义... });
在Sequelize中,默认会把你传入define的第一个参数(也就是模型名)作为db对象上的属性名。所以你在路由里应该用db.Orders.create(...),而不是db.orders.create(...)——别小看这个大小写差异,这是最常见的触发这个错误的原因!
修改你的routes.js代码:
db.Orders.create({ date: req.body.date, billingAddress: req.body.billingAddress, city: req.body.city, state: req.body.state, email: req.body.email, cupcakeType: req.body.cupcakeType, quantity: req.body.quantity, specialInstructions: req.body.specialInstructions, totalPrice: req.body.totalPrice, card: req.body.card, cardNumber: req.body.cardNumber, cvc: req.body.cvc, CustomerID: req.body.CustomerID })
2. 确认模型是否被正确加载到db对象
如果你用的是Sequelize CLI生成的项目结构,models/index.js会自动遍历models目录下的所有文件并导入模型。但如果是手动搭建的项目,需要确保index.js里的逻辑没问题:
// 这是标准的Sequelize模型入口文件逻辑,你可以对照检查 'use strict'; 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; // 这里把模型名作为db的属性名 }); // 关联模型(如果有的话) Object.keys(db).forEach(modelName => { if (db[modelName].associate) { db[modelName].associate(db); } }); db.sequelize = sequelize; db.Sequelize = Sequelize; module.exports = db;
如果你的index.js逻辑和上面一致,那只要orders.js在models目录下,模型就会被自动加载为db.Orders。
3. 验证模型挂载情况(可选)
可以在routes.js里加一行日志,确认db对象里到底有哪些模型:
var db = require("../models"); console.log("当前可用模型:", Object.keys(db)); // 看输出里有没有"Orders" module.exports = function(app) { // 路由代码... }
如果输出里没有"Orders",那就要检查orders.js是否在models目录下,或者index.js的文件过滤逻辑有没有排除它。
4. 额外检查:数据库连接是否正常
虽然你能拿到表单数据,但如果数据库连接失败,模型也无法正常初始化。可以在models/index.js里加个连接测试:
sequelize.authenticate() .then(() => { console.log('数据库连接成功!'); }) .catch(err => { console.error('数据库连接失败:', err); });
按照上面的步骤调整后,应该就能解决Cannot read property 'create' of undefined的问题,成功把表单数据写入MySQL的orders表了。
内容的提问来源于stack exchange,提问作者Trevia Griffin

