Как правильно использовать xmlhttprequest для отправки JSON в теле?

Я пытаюсь отправить довольно большое количество 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 в клиенте.

Большое спасибо, что прочитали мой пост.

Вы исходите из начальной точки SSL с вашим кодом или со стандартного http?

Marcus Parsons 06.02.2019 19:07

Привет @МаркусПарсонс. Это https от клиента к балансировщику нагрузки, но http от балансировщика нагрузки к моему серверу Node.

208_man 06.02.2019 22:31

У вас нет конечной точки в этом коде Node. Где вы пытаетесь посмотреть тело запроса?

Quentin 07.02.2019 14:58

"Парсер тела, например?" — Вы используете парсер тела.

Quentin 07.02.2019 14:58

@Quentin Я добавил код конечной точки в свой пост. Спасибо за чтение!

208_man 07.02.2019 15:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
808
1

Ответы 1

Когда я запускаю 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, который появляется сухим. Вот как я преодолеваю эту проблему.

208_man 07.02.2019 16:05

Другие вопросы по теме