为什么我的HTTP DELETE请求的body内容在Express后端显示为undefined?
解决方案
1. 补全body-parser配置
你仅引入了body-parser依赖,没有挂载对应的解析中间件到Express实例,无法解析JSON格式的请求体,添加如下配置(必须放在所有路由定义之前):
var express = require('express'); var bodyParser = require('body-parser'); var app = express(); // 新增以下两行 app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true }));
如果已经添加了上述配置,继续往下排查。
2. 修正AngularJS请求配置
你当前的请求存在两处问题:
- URL路径格式错误:路由定义为
/movie/:title,需要将电影名直接拼接在URL路径中,而非放到查询参数 - DELETE请求默认不会自动序列化请求体为JSON,需要手动指定请求头和序列化规则
修正后的前端代码如下:
$scope.del_movie = function(movie) { $http( { method: 'DELETE', // 直接将电影名拼入URL路径,编码防止特殊字符出错 url: '/movie/' + encodeURIComponent(movie.title), data: {'username': movie.username}, // 强制指定JSON格式请求头 headers: {'Content-Type': 'application/json'}, // 手动序列化请求体 transformRequest: function(data) { return JSON.stringify(data); } }).then(function successCallback(response) { console.log(response); return getData(); }, function errorCallback(response) { console.log('Error: ' + response); }); };
3. 修正逻辑校验Bug
你当前的用户身份比对逻辑存在错误:JSON.stringify会给邮箱字符串包裹双引号,和req.body.username的纯字符串永远无法匹配,直接去掉JSON.stringify即可:
// 修正前 oidcEmailString = JSON.stringify(req.oidc.user.email); // 修正后 oidcEmailString = req.oidc.user.email;
4. 可选优化:避免DELETE请求体兼容问题
部分HTTP代理、服务器对DELETE请求携带请求体的支持不规范,更稳妥的实现是将用户名放到自定义请求头中,后端直接从请求头取值:
前端请求新增headers配置:
headers: { 'Content-Type': 'application/json', 'X-Username': movie.username }
后端取值改为:
paramsUsernameString = req.get('X-Username');
额外安全建议
你当前删除操作的查询条件直接用了req.query,存在注入风险,建议手动指定查询条件:
// 修正前 Movie.findOneAndRemove(req.query, function(err, result) // 修正后 Movie.findOneAndRemove({ title: req.params.title, username: paramsUsernameString }, function(err, result)
内容的提问来源于stack exchange,提问作者Casey
相关产品推荐
相关产品推荐

