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

Express+Node.js向MySQL插入数据时出现重复插入问题求助

问题排查:Express+Node.js向MySQL插入重复数据

问题描述

使用Express和Node.js开发时,向MySQL的sales表插入数据出现重复:手动执行INSERT语句可正常插入2条数据,但代码执行后插入了4条。控制台日志显示saleInsert函数被调用了两次,待插入数组为[[0,1,2,"ENPG6ViT1w"],[0,1,3,"ENPG6ViT1w"]],最终表中出现重复数据。

相关代码

async function saleInsert(values) {

    try {
        let idSales = 0
        let quantidade = -1
        const teste = await values[0].map(obj => [idSales, 1, obj.idStock, idSale]);
        console.log(JSON.stringify(teste))

        const query = 'INSERT into sales (idSales, quantidade, idStockProduct, idSale) VALUES ?'
        const result = await new Promise((resolve, reject) => {
            conn.query(query, [teste], (error, results, fields) => {
                if (error) return reject(error);
                return resolve(results);
            });
        })

        const updateTableStock = await new Promise((resolve, reject) => {
            conn.query('update stock set  quantidade = quantidade ?  where idStock = ?', [quantidade, teste.idStock], (error, results, fields) => {
                if (error) return reject(error);
                return resolve(results);
            })
        })
        console.log(`update stock table ${updateTableStock}`)
        let tratado = JSON.stringify(result)
        return tratado
    } catch (err) {
        console.log(err)
    }

}

控制台日志

[nodemon] starting `node ./bin/server.js`
app listening on port 8080
Connection established!
insert Sale
values insert sales [[{"idStock":2,"nome":"Produto 1","preco":2,"quantidade":-6},{"idStock":3,"nome":"produto 2","preco":1,"quantidade":10}]]
[[0,1,2,"ENPG6ViT1w"],[0,1,3,"ENPG6ViT1w"]]
update stock table [object Object]
insert Sale
values insert sales [[{"idStock":2,"nome":"Produto 1","preco":2,"quantidade":-6},{"idStock":3,"nome":"produto 2","preco":1,"quantidade":10}]]
[[0,1,2,"ENPG6ViT1w"],[0,1,3,"ENPG6ViT1w"]]
update stock table [object Object]

排查与修复建议

1. 优先排查函数调用逻辑

控制台明确显示saleInsert被调用两次,这是重复插入的直接原因:

  • 检查路由是否重复注册:确认是否在多个文件中重复导入并注册了同一处理路由
  • 检查前端请求:查看是否存在按钮点击事件绑定多次、AJAX请求重复触发(比如网络延迟导致用户重复提交)的情况
  • 检查中间件:确认是否有中间件导致请求被重复处理(比如错误的全局中间件注册逻辑)

2. 修复代码中的显性问题

  • 移除多余的await:values[0].map是同步方法,不需要用await修饰,这行代码可改为const teste = values[0].map(obj => [idSales, 1, obj.idStock, idSale]);
  • 修正库存更新SQL:quantidade = quantidade ? 缺少运算符,应改为quantidade = quantidade + ?或quantidade = quantidade - ?(根据业务逻辑选择)
  • 修复库存更新的参数错误:teste是数组,不存在idStock属性,需要遍历teste数组批量更新库存,或编写批量更新的SQL语句,否则当前更新逻辑根本不会生效

3. 数据库层面添加防护

为避免后续脏数据产生,可给sales表添加唯一约束,比如将idStockProduct和idSale设为组合唯一键,这样即使代码重复调用,数据库会直接拒绝重复插入请求。


内容的提问来源于stack exchange,提问作者Mateus Vitorino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:55:30