NodeJS中Sequelize操作MySQL出现重复插入多行列问题求助
Sequelize插入数据重复3次的排查与解决
核心原因分析
你遇到的每种插入操作生成3条重复数据的问题,最可能的原因是你的脚本被重复执行了3次,常见场景包括:
- 使用
nodemon等热重载工具时,文件变动触发多次重启 - 手动重复执行了
node 脚本名.js命令 - 当前模块被其他文件多次
require
另外,代码中异步逻辑未做统一管理,可能加剧问题排查难度,但不是直接导致重复的原因。
分步解决方案
1. 先确认脚本执行次数
在createTask函数中添加日志,验证是否被多次调用:
const createTask = async () => { console.log("=== 开始执行createTask ==="); // c1 const newTask = Task.build({ name: "Learning NodeJS", status: "OPEN" }); await newTask.save(); console.log("build+save 插入完成"); // c2 const golangTask = await Task.create({ name: "Learning Golang", status: "OPEN", }); console.log("create 插入完成"); }; createTask();
运行脚本后,如果控制台输出3次=== 开始执行createTask ===,说明脚本被重复执行:
- 若用
nodemon,检查编辑器自动保存是否触发多次重启,可修改nodemon.json忽略不必要的文件(如.git、node_modules) - 若手动执行,确保只运行一次
node命令
2. 规范异步代码执行
将所有异步逻辑统一放在一个初始化函数中,避免零散调用导致的潜在问题,同时添加错误捕获:
const { Sequelize, DataTypes } = require("sequelize"); const sequelize = new Sequelize("task_management", "root", "Th@ng123", { host: "localhost", dialect: "mysql", }); const Task = sequelize.define( "Task", { name: { type: Sequelize.STRING, allowNull: false, }, status: { type: DataTypes.STRING, } } ); const syncModel = async () => { await Task.sync({ force: true }); console.log("Task模型同步完成"); }; const createTask = async () => { try { // build + save 方式 const newTask = Task.build({ name: "Learning NodeJS", status: "OPEN" }); await newTask.save(); // create 方式 await Task.create({ name: "Learning Golang", status: "OPEN", }); console.log("数据插入成功"); } catch (err) { console.error("插入失败:", err); } }; const checkConnect = async () => { try { await sequelize.authenticate(); console.log("数据库连接成功"); } catch (error) { console.error("数据库连接失败:", error); } }; // 统一执行初始化流程 const init = async () => { await checkConnect(); await syncModel(); await createTask(); }; init();
3. 额外检查点
- 确保没有在其他文件中重复实例化
Sequelize或重复调用createTask - 清空Task表后重新运行脚本,验证是否只插入2条数据(两种方式各一条)
内容的提问来源于stack exchange,提问作者Thắng Phạm
相关产品推荐
相关产品推荐

