为啥我的 HTTP DELETE 请求正文显示为未定义?

Posted

技术标签:

【中文标题】为啥我的 HTTP DELETE 请求正文显示为未定义?【英文标题】:Why is my HTTP DELETE request body showing up as undefined?为什么我的 HTTP DELETE 请求正文显示为未定义? 【发布时间】:2022-01-01 09:45:33 【问题描述】:

我正在制作一个人们可以评论电影的网络应用程序,并且我正在努力让用户无法删除其他用户的评论。

这是我删除电影的 AngularJS 函数:

$scope.del_movie = function(movie) 
    $http( 
        method: 'DELETE',
        url: '/movie/:title',
        params: 'title': movie.title,
        data: 'username': movie.username
    ).then(function successCallback(response) 
        console.log(response);
        return getData();
    , function errorCallback(response) 
        console.log('Error: ' + response);
    );
;

我已经 console.logged the movie.username 并且收到了正确的用户名。

但是,当这个请求被路由到我的快速删除函数时,req.body.username 似乎是未定义的。这是那条路线:

app.delete("/movie/:title", requiresAuth(), function(req, res) 
    paramsUsernameString = req.body.username;
    oidcEmailString = JSON.stringify(req.oidc.user.email);


    console.log("movie " + req.params.title);

    if(paramsUsernameString != oidcEmailString)
        console.log("req.params.username " + paramsUsernameString + " req.oidc.user.username " + oidcEmailString);
        console.log("can't delete someone else's review!");
    
    else
        Movie.findOneAndRemove(req.query, function(err, result) 
            if ( err ) throw err;
            res.json( 
                message: "req.params.username " + paramsUsernameString + " req.oidc.user.username " + oidcEmailString,
                movie: result
            );
        );
    
);

我四处搜索,这里关于 SO 的大多数问题都通过要求 body-parser 来解决,但我已经这样做了:

var express = require('express');
var bodyParser = require('body-parser');
var app = express();

我的 POST 请求也使用了 body-parser,而且那个很好用。

感谢任何帮助,如果需要,很乐意提供更多信息。谢谢!

【问题讨论】:

这能回答你的问题吗? body is empty when parsing DELETE request with express and body-parser 【参考方案1】:

问题并不完全在您的代码中,因为它在 AngularJs $http 服务中。 Link to original answer

某些提供者不鼓励在 HTTP DELETE 中发送正文,但 HTTP 规范并未明确禁止它。这就是为什么我们最终会遇到这种情况

为了克服这个问题,您应该做的是显式添加 Content-Type: application/json 标头并强制 HTTP 客户端,或者更好的是,不要在 DELETE 请求中发送正文不推荐。

您应该考虑使用路径参数、查询参数甚至用户标头,而不是使用正文,因为这似乎是您试图在请求中传递的内容

还要确保你确实使用了 body-parser 而不仅仅是需要它

const express = require('express');
const bodyParser = require('body-parser');
const app = express();

app.use(bodyParser.json())

【讨论】:

以上是关于为啥我的 HTTP DELETE 请求正文显示为未定义?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中使用 JSON 正文发出 http DELETE 请求?

如何将带有请求正文的 HTTP DELETE 转码为 gRPC

为啥 Firebug 不为未定义的属性显示“未捕获的类型错误”?

DELETE 请求正文的 RESTful 替代方案

REST API 设计 - 使用请求正文删除多个项目

http中的put,delete等请求为啥不安全