пустой json при использовании средства анализа тела bodyParser.json()

#javascript #node.js #json #express #body-parser

#javascript #node.js #json #выразить #body-parser

Вопрос:

Я пытаюсь отправить длинный json в виде post-запроса через скрипт на HTML-странице, например: (данные поступают из текстового поля, и это правильный массив 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 для чтения json в теле, например:

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

Проблема в том, что мое экспресс-приложение печатает пустой объект {} . Так это потому, что файл json, который я публикую, очень большой? Он имеет 64 объекта в массиве.

Или проблема возникает из-за использования приложения express, которое использует модуль body-parser как app.post('/api/updateOrgs', jsonParser, (req, res)=> { ?

Комментарии:

1. Вероятно, вам не хватает заголовка Content-Type: application / json

2. работает ли это для небольших json?

Ответ №1:

Попробуйте:

 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>
 

Ответ №2:

bodyParser Объект предоставляет различные фабрики для создания промежуточных программ. Все промежуточные программы будут заполнять свойство req.body анализируемым телом, когда заголовок запроса типа содержимого соответствует параметру type, или пустым объектом ({}), если не было тела для анализа, тип содержимого не был сопоставлен или произошла ошибка.

bodyParser.json([параметры])

Возвращает промежуточное программное обеспечение, которое анализирует только json и просматривает запросы только в тех случаях, когда заголовок Content-Type соответствует параметру type . Этот анализатор принимает любую кодировку тела в Юникоде и поддерживает автоматическую инфляцию кодировок gzip и deflate.

Новый объект body, содержащий проанализированные данные, заполняется в объекте запроса после промежуточного программного обеспечения (т. е. 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' }))