Я пытаюсь отправить довольно большое количество JSON на свой сервер Node-Express через xmlhttprequest. Раньше мне удавалось передавать параметры, кодируя их в URL-адресе. JSON, который я отправляю, слишком длинный для кодирования в URL-адресе, поэтому я пытаюсь отправить его в теле. Пока что тело — это пустой объект.
Я прочитал статья mdn о xmlhttprequest.send(). Я просмотрел это, это и это при переполнении стека, и решения не решают мою проблему.
Вот мой клиентский код:
var xhr = new XMLHttpRequest();
var body = {/*a javascript object with data to be sent to server*/};
var uri = 'https://my_internal_corporate_url/endpoint';
var bodyStringified = JSON.stringify(body)
xhr.open('POST', uri, true);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(bodyStringified);
xhr.onreadystatechange = processRequest;
xhr.addEventListener("readystatechange", processRequest, false);
function processRequest(e) {
// do stuff with server response
}Мой сервер node-express получает запрос, но я не могу найти содержимое bodystringified где-либо в объекте запроса, что говорит мне либо о том, что я неправильно строю объект запроса, либо о том, что мой API не может проанализировать запрос. правильно.
Я думал, что выбираю неправильный тип контента в методе setRequestHeader выше. Однако я начинаю думать, что мой сервер неправильно настроен для анализа тела запроса.
Вот фрагмент моего кода Node-Express:
const express = require('express');
const path = require('path');
require('dotenv').config({
path: path.join(__dirname, '../.env')
});
const bodyParser = require('body-parser');
const app = express();
const queries = require('./controllers/queries');
const os = require('os');
app.use(bodyParser.json());
app.use(express.static(path.join(__dirname, '../client/dist')));
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});И фрагмент кода конечной точки, обрабатывающий эти запросы:
const sendData = (data, res, status) => {
if (status) {
res.status(status).send(data);
} else {
res.send(data);
}
}
router.post('/rw_json_to_html', (req, res) => {
console.info('req: ', req); // <-- when I inspect this obj, I can't find my json.
let data = // do stuff with the json provided in body of req object
sendData(data, res, 200);
}ВОПРОСЫ: 1. Я неправильно устанавливаю заголовки запроса или что-то в клиентском коде? 2. Я что-то упустил в параметрах Node-Express для правильного разбора тела запросов? Например, параметры парсера тела? Я использовал axios в прошлом, и у меня не было проблем с получением тела запроса, но текущее приложение требует, чтобы я использовал простой ванильный javascript в клиенте.
Большое спасибо, что прочитали мой пост.
Привет @МаркусПарсонс. Это https от клиента к балансировщику нагрузки, но http от балансировщика нагрузки к моему серверу Node.
У вас нет конечной точки в этом коде Node. Где вы пытаетесь посмотреть тело запроса?
"Парсер тела, например?" — Вы используете парсер тела.
@Quentin Я добавил код конечной точки в свой пост. Спасибо за чтение!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Когда я запускаю console.info('req: ', req);, я получаю более 800 строк вывода, поэтому неудивительно, что вы ничего не можете там найти.
См. документация для body-parser:
app.use(bodyParser.json()) app.use(function (req, res) { res.setHeader('Content-Type', 'text/plain') res.write('you posted:\n') res.end(JSON.stringify(req.body, null, 2)) })
Декодированный JSON появляется в req.body.
Спасибо @Квентин. Я просто выполняю поиск в своем текстовом редакторе по ключевому слову в моем JSON, который появляется сухим. Вот как я преодолеваю эту проблему.
Вы исходите из начальной точки SSL с вашим кодом или со стандартного http?