【问题标题】:Empty req.body receiving text/plain POST request to node.js空 req.body 接收到 node.js 的文本/纯 POST 请求
【发布时间】:2021-05-25 18:37:20
【问题描述】:

为什么我无法接收在 POST 请求正文中发送的纯文本?

来自客户端浏览器的请求:

var xhr = new XMLHttpRequest();
xhr.open("POST", "/MyRoute/MySubRoute");
xhr.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
xhr.send("hello!");    

在我的节点服务器上使用 Express:

app.post('/MyRoute/MySubRoute', function(req, res) {
    console.log("Received:"+require('util').inspect(req.body,{depth:null});
    res.send();
});

登录到我得到的控制台:

Received:{}

我尝试过使用text/plain(无字符集),结果相同。如果我将内容类型更改为 application/json 并传递一个简单的 JSON 字符串,它就可以正常工作。

【问题讨论】:

  • req.body 是什么?也许util.inspect() 函数不适用于字符串。
  • 我还使用了没有 util.inspect() 的 console.log(req.body),并尝试了 JSON.stringify(req.body),无论我怎么看,结果都是空的。 typeof(req.body)Object
  • 看这里,由 TJ 自己回答:stackoverflow.com/a/12497793/2083599 - 这不是最佳的做法,但总比没有好...
  • 非常感谢 - 我没有找到这个,因为我认为问题出在我的 POST 请求上,而不是 Express 无法识别内容类型。
  • Express 无法识别内容类型不是问题。真正的问题是,在你试图看到身体的时候,你还没有收到它。通过即使在 req 上监听数据,您也可以获得它。全部接收完毕后触发结束事件。

标签: node.js http post


【解决方案1】:

总结以上回答问题的cmets:

  • 客户端的 XMLHttpRequest 正确
  • 在服务器端,Express 使用connect's bodyParser,默认情况下只支持以下内容类型:
    • 应用程序/json
    • application/x-www-form-urlencoded
    • 多部分/表单数据
  • 由于Express没有实现text/plain的content-type,所以没有方法等待body收到后才调用app/post路线。
  • 解决方案是将 text/plain 内容类型添加到 Express 中,如 here 所述

【讨论】:

    【解决方案2】:

    添加

    app.use(express.text())
    

    您可以阅读更多关于它的信息here

    【讨论】:

    • 请务必使用相关代码而不是链接来编辑您的答案。
    猜你喜欢
    • 2019-07-04
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    相关资源
    最近更新 更多