无法在快速js节点中获取请求有效负载

时间:2018-05-30 13:29:20

标签: javascript node.js express

这是我的Node Express代码,

(function () {
    'use strict';
    var fs = require('fs');
    var cors = require('cors');
    var bodyParser = require('body-parser');
    var express = require('express'),
        app = express(),
        port = 8112;


    app.use(cors());
    app.use(bodyParser.urlencoded({ extended: true }));
    app.use(bodyParser.json());
    app.listen(port);


    app.route('/abc')
        .post(abc);


    function abc(req,res){
        console.dir(req.body);
        res.header("Access-Control-Allow-Origin", "*");
        res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
        res.sendStatus(200);
    }

})();

但我得到了请求正文

  

{}

但在Chrome浏览器的网络标签中,我可以看到请求有效负载。     请注意在此POST调用之前触发OPTIONS。

请求标题

  

POST /abcHTTP/1.1主机:localhost:8112连接:
  keep-alive Content-Length:11 Pragma:no-cache Cache-Control:no-cache
  来源:http://localhost:4200用户代理:Mozilla / 5.0(Windows NT   10.0; Win64平台; x64)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 66.0.3359.181 Safari / 537.36
  X-API密钥:CExkxDlFC35ckfCGX6m61x76GxIYH2h2Iv8bX874
  内容类型:文本/无格式;字符集= UTF-8
  接受: / Referer:   http://localhost:4200/dashboard   Accept-Encoding:gzip,deflate,br
  Accept-Language:en-US,en; q = 0.9

请求有效负载

  

{" DD":" DD"}

5 个答案:

答案 0 :(得分:4)

您需要发送:Content-Type: application/json才能使bodyParser.json()正常工作,如果没有它,您的JSON有效负载将无法解析,这就是您获得的原因:{}

来自docs

  

bodyParser对象公开了各种工厂来创建中间件。   所有中间件都将使用解析的方法填充req.body属性   当Content-Type请求标头与type选项匹配时,或者   如果没有要解析的主体,则为空对象({}),即Content-Type   未匹配,或发生错误。

使用.fetch的示例:

fetch('http://localhost:4200/dashboard', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({dd: 'dd'})
});

答案 1 :(得分:0)

您的内容类型标题是text / plain。请尝试替换

app.use(bodyParser.json());

app.use(bodyParser.text());

答案 2 :(得分:0)

您好@Pradhaban Nandhakumar,我认为您必须将数据作为行数据传递。 请尝试以下代码段。

您应始终传递原始数据。

app.post('/users', (req, res) => { res.send(req.body); });

答案 3 :(得分:0)

您发布的是纯文本字符串而不是JSON。考虑向我们展示您如何发布数据(jQuery,Fetch API等)。

只需指定

即可
headers: {
  'Accept': 'application/json',
  'Content-Type': 'application/json'
}

在您的请求标头中(前端)。然后,Express正文解析器应该能够检测到有效的JSON并打印结果。请注意,Accept并非必需,但它会指示服务器客户端理解并接受JSON响应。

或者,在前端使用像Easy Fetch这样的简单库来管理服务器端调用,而不必处理响应解析或标头设置。

答案 4 :(得分:0)

这通常是由于您的http请求中的“ Content-type”标头引起的。

JSON体
bodyParser.json()仅接受“ application / json”类型,并拒绝其他不匹配的内容类型。

解决方案1:接受application/json以外的其他内容类型

检查您的请求标头“ Content-type”,并将其添加到服务器中bodyParser.json([options])中的options参数中。

例如,如果您具有以下内容:
“内容类型:application / csp-report”

app.use(bodyParser.json({ type: ["application/json", "application/csp-report"] }));

您还可以使用自exprss v4.16.0起的内置中间件:

app.use(express.json({ type: ['application/json', 'application/csp-report'] }));

有关更多信息,请参见this documentation

注意:仅在无法将Content-type更改为application/json的情况下使用此方法。

解决方案2(推荐):在Http请求中将标题content-type更改为application/json

黑体编码的尸体怎么样?
这类似于json正文,但有两个区别:

  1. 请求中接受的“内容类型”标头为“ application / x-www-form-urlencoded”

  2. 主体有效载荷是url编码格式(不是json对象):
    格式: param_1 = value_1&param_2 = value_2&...

app.use(express.urlencoded({ extended: false }));

请参见docs