Экспресс-почта не получает данные JSON [закрыть]

#javascript #node.js #json #express #post

#javascript #node.js #json #экспресс #Публикация

Вопрос:

У меня есть эта проблема, потому что я отправляю данные через JavaScript, используя XMLHttpRequest, но не получаю их в node.js экспресс-почтовый метод. Я не знаю, что я делаю не так.

Мой скрипт — функциональная форма выполняется при загрузке окна

 function form() {
  const btn = document.getElementById("save-data");
  let currentPage = window.location.href.split("/").at(-1);

  function sendData(data) {
    const XHR = new XMLHttpRequest();
    XHR.open("POST", window.location.href);
    XHR.setRequestHeader("Content-Type", "application/json");
    console.log(data); // I get right data
    XHR.send(data);
  }

  btn.addEventListener("click", () => {
    switch (currentPage) {
      case "settings":
        const prefix = document.getElementById("prefix").value;
        let buttonState = document.getElementById("module-state");

        if (buttonState.hasAttribute("enable")) {
          buttonState = "enable";
        } else {
          buttonState = "disable";
        }

        sendData({
          prefix: prefix,
          buttonState: buttonState,
          announcements: {
            giveawayChannelID: 123,
            updateChannelID: 123,
          },
        });
    }
  });
}
 

Мой Node.js код

 router.post('/:id/settings', (req, res) => {
   console.log(req.body) // {}
})
 

Мольбы о помощи.

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

1. Возможно, вам будет намного проще работать с Fetch API. Он хорошо поддерживается в браузерах. Обычно нам не нужен XHR уже много лет. 🙂

2. Вы включили синтаксический анализатор тела в Express?

3. Нет, я не включаю это. Как это сделать ?

4. send Функция не принимает объект, он будет превращен в строку '[object Object]' , которая должна вызвать ошибку при синтаксическом анализе. Обязательно используйте XHR.send(JSON.stringify(data));

Ответ №1:

Вам необходимо установить пакет body-parser с помощью NPM и потребовать его в своем коде

Попробуй

 npm i body-parser
 

Затем в вашем сценарии основного узла потребуйте этого

 const bodyParser = require('body-parser');
 

после этого вы должны установить его в качестве промежуточного программного обеспечения для express

 app.use(bodyParser.json()); //Handles JSON requests
app.use(bodyParser.urlencoded({ extended: false })); //Handles normal post requests
 

после этих шагов вы можете получить доступ к таким значениям, как req.body.value

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

1. Вы можете использовать express.json() и express.urlencoded() в наши дни. Больше нет необходимости в отдельном пакете. (Разработчики Express действительно разделили это несколько лет назад, но затем решили объединить его обратно.)

2. Я разрабатываю проект узла rn. На прошлой неделе я хотел использовать эти два с express, и я получил ошибки. Мне пришлось использовать его собственный пакет.

3.expressjs.com/en/4x/api.html#express.json expressjs.com/en/4x/api.html#express.urlencoded

4. Спасибо за ответ