使用 body-parser bodyParser.json() 时为空 json

empty json when using body-parser bodyParser.json()

我正在尝试通过 HTML 页面中的脚本将长 json 作为 post 请求发送,例如:(数据来自文本框,它是一个正确的数组json)

<script>
        /* UPDATE ORGANIZATION LIST*/
        function updateOrgs () {
            var data = $('#showOrgs').val();

            $.ajax({
                url : "http://localhost:8000/api/updateOrgs",
                type: "POST", // data type (can be get, post, put, delete)
                data : {json:JSON.parse(data)}, // data in json format
                async : false, // enable or disable async (optional, but suggested as false if you need to populate data afterwards)
                success: function(response, textStatus, jqXHR) {
                    alert(response);
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    alert(errorThrown)
                }
            });
        }        
</script>

我已将快递设置为:

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

// body-parser
// create application/json parser
var jsonParser = bodyParser.json()
 
// create application/x-www-form-urlencoded parser
var urlencodedParser = bodyParser.urlencoded({extended: false})

我在我的 node express 应用程序中使用 body-parser 来读取正文中的 json,例如:

app.post('/api/updateOrgs', jsonParser, (req, res)=> {
    try {
        console.log(req.body);
        // send response
        res.send('Successfully updated');
    } catch (e) {
        res.send(e);
    }
});

问题 是我的 express 应用程序打印了一个空对象 {}。是不是因为我正在 posting 的 json 文件很大?它在一个数组中有 64 个对象。

或者问题出在使用 body-parser 模块的 express 应用 app.post('/api/updateOrgs', jsonParser, (req, res)=> {?

bodyParserobject 公开各种工厂以创建中间件。当 Content-Type 请求 header 匹配类型选项时,所有中间件将使用解析的 body 填充 req.body 属性,或者一个空的 object ( {}) 如果没有 body 解析,则 Content-Type 不匹配,或者发生错误。

bodyParser.json([选项])

Returns 中间件只解析 json 并且只查看 Content-Type header 匹配类型选项的请求。此解析器接受 body 的任何 Unicode 编码并支持 gzip 和 deflate 编码的自动 inflation。

包含已解析数据的新 body object 在请求 object 中间件之后填充(即 req.body)。

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

var app = express()

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))

// parse application/json
app.use(bodyParser.json())
// POST /login gets urlencoded bodies
app.post('/login', urlencodedParser, function (req, res) {
  res.send('welcome, ' + req.body.username)
})

// POST /api/users gets JSON bodies
app.post('/api/users', jsonParser, function (req, res) {
  // create user in req.body
})

更改解析器接受的类型

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

var app = express()

// parse various different custom JSON types as JSON
app.use(bodyParser.json({ type: 'application/*+json' }))

// parse some custom thing into a Buffer
app.use(bodyParser.raw({ type: 'application/vnd.custom-type' }))

// parse an HTML body into a string
app.use(bodyParser.text({ type: 'text/html' }))

试一试:

dataType: 'json',
contentType: 'application/json',
data : JSON.stringify({json:JSON.parse(data)}),

所有代码:

<script>
        /* UPDATE ORGANIZATION LIST*/
        function updateOrgs () {
            var data = $('#showOrgs').val();

            $.ajax({
                url : "http://localhost:8000/api/updateOrgs",
                type: "POST", // data type (can be get, post, put, delete)
                dataType: 'json',
                contentType: 'application/json',
                data : JSON.stringify({json:JSON.parse(data)}), // data in json format
                async : false, // enable or disable async (optional, but suggested as false if you need to populate data afterwards)
                success: function(response, textStatus, jqXHR) {
                    alert(response);
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    alert(errorThrown)
                }
            });
        }        
</script>