Как правильно использовать xmlhttprequest для отправки JSON в теле? - PullRequest
0 голосов
/ 06 февраля 2019

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

Мой сервер-экспресс-узел получает запрос, но я не могу найти содержимое '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.log('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 в клиенте.

Большое спасибо за чтение моего поста.

1 Ответ

0 голосов
/ 07 февраля 2019

Когда я запускаю console.log('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.

...