#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' }))