如何向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中间件:
在app.js中配置:npm install method-override
此时表单method设为const methodOverride = require('method-override'); app.use(methodOverride('_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
相关产品推荐
相关产品推荐

