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

如何向Node.js路由传递参数数组?MySQL批量删除实现疑问

实现EJS复选框批量删除MySQL数据的方案

1. 修改EJS视图,添加批量选择与提交表单

保留原有单行删除按钮,同时新增复选框和批量删除表单:

<!-- 用表单包裹用户列表,通过POST提交批量删除请求 -->
<form action="/users/batch-delete" method="POST">
  <!-- 若要使用DELETE方法,需先配置method-override中间件,再添加此隐藏域 -->
  <!-- <input type="hidden" name="_method" value="DELETE"> -->
  
  <table>
    <thead>
      <tr>
        <th><input type="checkbox" id="select-all" /></th>
        <th>ID</th>
        <th>操作</th>
      </tr>
    </thead>
    <tbody>
      <% data.forEach(user => { %>
      <tr>
        <td><input type="checkbox" name="ids[]" value="<%= user.id %>" /></td>
        <td><%= user.id %></td>
        <td>
          <a href="/users/delete/<%= user.id %>" class="btn btn-danger btn-sm">Delete</a>
        </td>
      </tr>
      <% }) %>
    </tbody>
  </table>

  <button type="submit" class="btn btn-danger">批量删除选中项</button>
</form>

<!-- 可选:全选/取消全选功能 -->
<script>
document.getElementById('select-all').addEventListener('change', function(e) {
  const checkboxes = document.querySelectorAll('input[name="ids[]"]');
  checkboxes.forEach(cb => cb.checked = e.target.checked);
});
</script>

2. 修改Node.js路由,处理批量删除请求

核心:必须用参数化查询防止SQL注入,禁止直接拼接字符串!

// 引入你的数据库配置模块
const db = require('../path-to-your-db-config');

// 批量删除路由,使用POST方法(或配合method-override用DELETE)
router.post('/batch-delete', function(req, res, next) {
  const ids = req.body.ids; // 获取前端传递的ID数组

  if (!ids || ids.length === 0) {
    return res.redirect('/users'); // 未选中任何项时,直接返回列表页
  }

  // 构建参数化SQL的占位符,数量与ID数组长度匹配
  const placeholders = ids.map(() => '?').join(',');
  const sql = `DELETE FROM users WHERE id IN (${placeholders})`;

  // 执行参数化查询,将ID数组作为参数传入
  db.query(sql, ids, function(err, result) {
    if (err) {
      console.error(err);
      return next(err);
    }
    console.log(`成功删除${result.affectedRows}条数据`);
    res.redirect('/users'); // 删除完成后返回用户列表页
  });
});

3. 关键注意事项

  • HTTP方法选择:删除操作优先用POST或DELETE,避免用GET(GET会被浏览器缓存,且不符合RESTful规范)。若用DELETE方法,需先安装并配置method-override中间件:
    npm install method-override
    
    在app.js中配置:
    const methodOverride = require('method-override');
    app.use(methodOverride('_method'));
    
    此时表单method设为POST,添加隐藏域<input type="hidden" name="_method" value="DELETE">,路由改为router.delete('/batch-delete', ...)。
  • SQL注入防护:绝对不能直接将ID数组拼接到SQL字符串中,必须使用?占位符的参数化查询方式。
  • 空数组处理:要判断用户未选中任何项的情况,避免执行DELETE FROM users WHERE id IN ()这类无效SQL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:30:49