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

Express配合Postman提交数组批量删除数据库已存在条目问题求助

问题根因

当前代码仅适配接收单条JSON对象格式的请求,当提交数组格式的多条数据时,req.body为数组类型,直接读取req.body.assetId会返回undefined,因此触发了你观测到的SQL查询异常。
同时你的现有代码直接拼接SQL语句,存在SQL注入风险,优化时会同步修复该问题。

优化步骤

1. 前置检查:确保Express已配置JSON解析中间件

在你的服务入口文件(通常是app.js/server.js)中确认存在以下配置,否则无法正常解析JSON格式的请求体:

app.use(express.json());

2. 修改控制器逻辑(item.controller.js)

新增单条/批量请求的判断逻辑,适配两种请求格式:

const Item = require("../models/item.model.js");

// 单条处理逻辑抽离为复用函数
const handleSingleItem = (itemData, callback) => {
  const item = new Item({
    itemId: itemData.assetId,
    botId: itemData.botId,
  });
  Item.IsReserved(item, callback);
};

exports.IsReserved = async (req, res) => {
  // Validate request
  if (!req.body || (Array.isArray(req.body) && req.body.length === 0)) {
    return res.status(400).send({
      message: "Content can not be empty!"
    });
  }

  try {
    // 判断是否为批量请求
    if (Array.isArray(req.body)) {
      // 提取所有assetId调用批量处理方法
      const assetIds = req.body.map(item => item.assetId);
      Item.batchDeleteReserved(assetIds, (err, data) => {
        if (err) {
          return res.status(500).send({
            message: err.message || "Some error occurred while processing batch items."
          });
        }
        res.send(data);
      });
    } else {
      // 走原有单条处理逻辑
      handleSingleItem(req.body, (err, data) => {
        if (err) {
          return res.status(500).send({
            message: err.message || "Some error occurred while processing the item."
          });
        }
        res.send(data);
      });
    }
  } catch (err) {
    res.status(500).send({
      message: err.message || "Server internal error"
    });
  }
};

3. 修改模型层逻辑(item.model.js)

新增批量处理方法,同时修复原有SQL注入风险,改用参数化查询:

const sql = require("./db.js");

function Item(itemData) {
  this.itemId = itemData.itemId;
  this.botId = itemData.botId;
}

// 原有单条处理方法,改用参数化查询避免注入
Item.IsReserved = (RItem, result) => {
    sql.query(`SELECT * FROM ReservedItems WHERE itemId = ?`, [RItem.itemId], (err, res) => {
        if (err) {
          console.log("error: ", err);
          result(err, null);
          return;
        }
        if(res.length){
            sql.query(`DELETE FROM ReservedItems WHERE itemId = ?`, [RItem.itemId], (err, deleteRes) => {
                if (err) {
                    console.log("error: ", err);
                    result(err, null);
                    return;
                }
                result(null, { deletedId: RItem.itemId, ...RItem });
            });
        }
        else{
            result(null, { message: "nothing to do"});
        }
    });
};

// 新增批量处理方法
Item.batchDeleteReserved = (assetIds, result) => {
  // 生成对应数量的占位符
  const placeholders = assetIds.map(() => '?').join(',');
  sql.query(`SELECT * FROM ReservedItems WHERE itemId IN (${placeholders})`, assetIds, (err, selectRes) => {
    if (err) {
      console.log("error: ", err);
      result(err, null);
      return;
    }
    if (selectRes.length === 0) {
      return result(null, { message: "nothing to do", deletedCount: 0 });
    }
    // 批量删除存在的条目
    sql.query(`DELETE FROM ReservedItems WHERE itemId IN (${placeholders})`, assetIds, (err, deleteRes) => {
      if (err) {
        console.log("error: ", err);
        result(err, null);
        return;
      }
      result(null, { 
        message: "batch delete completed", 
        deletedCount: deleteRes.affectedRows,
        deletedIds: assetIds 
      });
    });
  });
};

module.exports = Item;
验证方式
  • 提交单条JSON对象:原有逻辑保持兼容,运行结果不变
  • 提交数组格式的多条数据:会自动走批量处理逻辑,一次性查询并删除所有匹配的条目

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:36:03