You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:57:20