Req.body - пустой node.js и экспресс

Я пытаюсь отправить строку с клиентской страницы на сервер, но сервер получает пустой объект. Вот мой клиентский код:

fetch("/sugestions/sugestions.txt", {
  method: "POST",
  body: JSON.stringify({ info: "Some data" }),
  headers: {
    "Content-Type": "application/json; charset=utf-8"
  }
})
  .then(res => {
    if (res.ok) console.info("Yay it worked!");
    else window.alert("Uh oh. Something went wrong!\n" + res);
  });

Это мой код на стороне сервера:

const express = require("express");
const url = require("url");
const fs = require("fs");
const bodyParser = require("body-parser");

const app = express();
const port = process.env.PORT || 8080;

app.set("view engine", "ejs");
app.use(bodyParser());

app.post("/sugestions/*", (req, res) => {
  info = JSON.parse(req.body);
  fs.appendFile(path("req").pathname, info.info, (err) => {
    if (err) res.status(404).end();
    else res.status(200).end();
  });
});

app.listen(port);

Вот функция пути, если это имеет значение:

const path = req => url.parse(`${req.protocol}://${req.get("host")}${req.originalUrl}`, true);

Поскольку вы используете JSON для отправки данных от клиента и получения их на сервере, попробуйте добавить app.use(bodyParser.json()) на свой сервер. Вам больше не нужно JSON.parse()req.body.

ionizer 08.04.2019 04:34
Поведение ключевого слова "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) для оценки ваших знаний,...
1
2
1 659
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Добавьте эти две строки в свой код

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

Чтобы получить доступ к телу запроса, вам нужно использовать bodyParser. И вам нужно явно указать вашему bodyParser форматы данных, которые вам нужно проанализировать. Теперь, подойдя к вашему решению, Заменять

app.use(bodyParser());

с участием

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
Ответ принят как подходящий

Начиная с экспресс 4.16.0 вы можете использовать app.use(express.json()); для получения данных json из запроса, в вашем случае это будет. Вам не нужно использовать bodyparser и все такое.

const express = require("express");
const url = require("url");
const fs = require("fs");
const bodyParser = require("body-parser");

const app = express();
const port = process.env.PORT || 8080;

app.set("view engine", "ejs");
app.use(express.json())// add this line

app.post("/sugestions/*", (req, res) => {
  info = JSON.parse(req.body);
  fs.appendFile(path("req").pathname, info.info, (err) => {
    if (err) res.status(404).end();
    else res.status(200).end();
  });
});

app.listen(port);

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