Angular4通过NodeJS向MongoDB批量删数据时req.body为空的问题
解决Angular DELETE请求无法传递数据到MongoDB后端的问题
我来帮你一步步排查和解决这个问题:
1. Angular端的DELETE请求写法错误
你现在的deleteData服务函数里,把ID数组直接作为http.delete的第二个参数是不对的——Angular的HttpClient.delete()方法的第二个参数是配置选项对象,如果要传递请求体,需要把数据放在options.body里。
修改你的Angular服务代码:
deleteData(dataToSend: any[]) { // 把要传递的数组放在options的body属性中 return this.http.delete(this.api, { body: dataToSend }); }
组件里的代码可以简化一下(如果后端接受纯ID数组,直接传原数组即可;如果需要{_id: xxx}格式,再保留你的转换逻辑):
deleteData(data: string[]) { const dataToSend = data.map(id => ({ _id: id })); this.service.deleteData(dataToSend).subscribe( (res) => console.log('删除成功', res), (err) => console.error('删除失败', err) ); }
2. 后端确保正确解析请求体
你提到req.body是空对象,大概率是因为没有在Express中配置JSON解析中间件。在你的Node.js入口文件里,一定要加上:
const express = require('express'); const app = express(); // 必须配置这个中间件,才能解析JSON格式的请求体 app.use(express.json()); // 之后再配置你的路由 app.delete('/tasks', function(req,res){ console.log(req.body); // 现在应该能拿到数据了 const ids = req.body.map(item => item._id); const myquery = { _id: { $in: ids } }; Model.collection.deleteMany(myquery, function(err, obj) { if (err) { console.error(err); return res.status(500).json({ message: '删除失败' }); } res.status(200).json({ message: `成功删除${obj.deletedCount}条数据` }); }); });
3. 处理CORS预检请求(OPTIONS)
浏览器发送OPTIONS请求是CORS的预检机制,用来确认后端是否允许当前请求。你需要确保后端正确处理OPTIONS请求,并且允许DELETE请求携带application/json类型的请求体。
可以用cors中间件简化配置:
const cors = require('cors'); // 生产环境建议指定具体允许的域名,而非通配符 app.use(cors({ origin: true, credentials: true, methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], allowedHeaders: ['Content-Type', 'Authorization'] }));
如果不想用第三方中间件,也可以手动处理OPTIONS请求:
app.options('*', (req, res) => { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization'); res.sendStatus(200); });
额外优化建议
- 后端使用
deleteMany后,记得给客户端返回响应,否则Angular的subscribe会一直处于等待状态; - 如果你的MongoDB
_id是ObjectId类型,需要把字符串ID转换成mongoose.Types.ObjectId(用Mongoose的话),否则可能匹配不到文档:const mongoose = require('mongoose'); const ids = req.body.map(item => mongoose.Types.ObjectId(item._id));
内容的提问来源于stack exchange,提问作者Anna F
相关产品推荐
相关产品推荐

