使用Axios.delete()传递ID数组批量删除时出现400错误的排查
问题排查与修复方案
前端问题:Axios Delete请求未正确传递数据
Axios的delete方法默认不会把第二个参数作为请求体发送,必须显式将数据放在data字段中。你的代码直接传递{isCHecked},导致后端无法接收到ID数组。
修改前端deleteAll函数:
const deleteAll = async()=>{ console.log(isCHecked) await Axios.delete('http://localhost:3500/newItems', { data: { ids: isCHecked } // 将ID数组存入data字段 }).then((response) => { console.log(response.status) console.log(response.data) }) .catch((e) => console.log('something went wrong :(', e)); }
后端问题1:请求体解析与获取错误
首先要确保Express服务器已配置JSON解析中间件(否则req.body会一直是undefined),然后从req.body.ids中获取前端传递的ID数组,而非直接取req.body。
在服务器文件中添加中间件(需放在路由挂载前):
app.use(express.json()) app.use('/newItems', require('./routes/newItemsRoutes'))
修改后端控制器的参数获取逻辑:
const deleteNewItems = asyncHandler(async (req, res) => { const { ids } = req.body // 解构获取ID数组 console.log(ids) if(!ids || ids.length === 0) { return res.status(400).json({message: 'Items Ids are required'}) } // 后续逻辑... })
后端问题2:Mongoose批量删除逻辑错误
findById仅支持查询单个文档,批量查询需用NewItemsData.find({_id: {$in: ids}})- 不能在查询返回的文档数组上调用
deleteMany(),需直接在模型上执行批量删除操作
修改控制器的删除逻辑:
const deleteNewItems = asyncHandler(async (req, res) => { const { ids } = req.body console.log(ids) if(!ids || ids.length === 0) { return res.status(400).json({message: 'Items Ids are required'}) } // 校验待删除ID是否存在 const existingItems = await NewItemsData.find({_id: {$in: ids}}).exec() if(existingItems.length !== ids.length) { return res.status(400).json({message: '部分商品不存在'}) } // 执行批量删除 const result = await NewItemsData.deleteMany({_id: {$in: ids}}).exec() if(result.deletedCount === 0) { return res.status(400).json({message: '未删除任何商品'}) } res.json({message: `${result.deletedCount} 个商品已被删除`}) })
内容的提问来源于stack exchange,提问作者Aham_Uzoma
相关产品推荐
相关产品推荐

