使用Sequelize CLI生成模型后调用create出现未定义错误求助
解决"Cannot read property 'create' of undefined"的问题
这个错误说明你导入的User是undefined,问题出在模型导入方式和模块导出的匹配上,咱们一步步来修复:
1. 修正模型导入语句
你的models/index.js导出的是一个包含所有模型的db对象(默认导出),而非单独导出User。当前的解构导入方式不匹配,需要改成以下两种方式之一:
// 方式1:先导入完整db对象,再解构出User import db from '../../../../models'; const { User } = db; // 方式2:明确指定导入index.js文件,直接解构 import { User } from '../../../../models/index.js';
如果你的项目配置了ES模块(比如package.json里有"type": "module"),CommonJS的module.exports会被识别为默认导出,解构时需要明确从默认导出中提取User。
2. 验证User模型是否被正确加载
确认models/index.js已经成功读取到user.js:
- 检查
user.js是否在models目录下,文件名没有拼写错误(比如别写成users.js) - 确认
user.js里的modelName是'User',和index.js里db[model.name] = model的逻辑对应,这样db.User才能正确指向模型。
3. 补充:修复User模型的字段遗漏
我注意到你的user.js模型里,init方法只定义了name字段,但数据库里有email和password,创建用户时也传入了email。记得把这些字段补充到模型中,否则创建时会忽略这些属性,甚至可能引发验证错误:
User.init({ name: DataTypes.STRING, email: DataTypes.STRING, // 补充email字段 password: DataTypes.STRING // 补充password字段 }, { sequelize, modelName: 'User', });
4. 额外检查:异步操作的上下文
确保你的await代码是在async函数中执行的,比如Express路由里的写法:
app.post('/users', async (req, res) => { try { const { User } = require('../../../../models'); // 用CommonJS的写法 // 或者用ES模块的正确导入方式 await User.create({ name: 'john doe', email: 'john@gmail.com' }) res.json({"message": "create"}) } catch (error) { res.send(error.message) } })
按照上面的步骤调整后,应该就能解决User为undefined的问题了。
内容的提问来源于stack exchange,提问作者jesica
相关产品推荐
相关产品推荐

