Sequelize v6配合MariaDB使用create插入数据成功但返回id为undefined
问题原因
- 第一个核心原因是未正确处理异步逻辑:
User.create()是异步方法,返回值为 Promise 对象,你直接同步赋值打印的是未执行完成的 Promise,自然无法拿到生成的 id 字段。 - 如果已经使用
await正确接收返回结果仍存在问题,就是第二类原因:- 你的项目没有安装
uuid依赖,Sequelize 本身不自带 UUID 生成能力,无法在代码层面生成 UUIDV4 的值作为主键。如果你数据库表的 id 字段配置了默认生成 UUID 的逻辑,数据可以插入成功,但 Sequelize 默认不会在插入后主动回查这条记录,导致返回的实例中 id 为 undefined。 - 模型定义和实际数据库表结构不匹配,也可能导致该问题出现。
- 你的项目没有安装
解决方法
- 首先修正异步调用写法,必须通过
await或者.then()拿到 create 执行完成后的实例:
// await 写法,只能在 async 函数内部使用 async function addUser() { const user = await User.create(); console.log(user.id); return user; } // 回调写法 User.create().then(user => { console.log(user.id); });
- 修正异步逻辑后仍无法拿到 id,先安装 uuid 依赖:
npm install uuid # 若使用yarn则执行 yarn add uuid
- 安装依赖后问题仍存在,说明 id 是数据库层面生成的,插入后需要手动回查记录:
const user = await User.create(); await user.reload(); // 主动查询数据库最新数据 console.log(user.id);
如果不想每次调用都手动 reload,可以在模型定义中添加 afterCreate 钩子自动完成回查:
// 修改User模型的define配置 { tableName: 'user', hooks: { afterCreate: async (instance) => { await instance.reload(); } } }
- 测试环境可以先同步表结构,排除模型和表字段不匹配的问题:
// 仅测试环境使用,会清空user表的已有数据 await User.sync({force: true});
内容的提问来源于stack exchange,提问作者Carlos
相关产品推荐
相关产品推荐

