Не удается получить полезную нагрузку запроса в экспресс-узле js

Это мой код Node Express,

(function () {
    'use strict';
    var fs = require('fs');
    var cors = require('cors');
    var bodyParser = require('body-parser');
    var express = require('express'),
        app = express(),
        port = 8112;


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


    app.route('/abc')
        .post(abc);


    function abc(req,res){
        console.dir(req.body);
        res.header("Access-Control-Allow-Origin", "*");
        res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
        res.sendStatus(200);
    }

})();

Но я получаю тело запроса как

{}

Но в моей сетевой вкладке в Chrome я вижу полезную нагрузку запроса. Обратите внимание, что OPTIONS запускается перед этим вызовом POST.

Заголовки запросов

POST /abcHTTP/1.1 Host: localhost:8112 Connection:
keep-alive Content-Length: 11 Pragma: no-cache Cache-Control: no-cache
Origin: http://localhost:4200 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36
x-api-key:CExkxDlFC35ckfCGX6m61x76GxIYH2h2Iv8bX874
Content-Type:text/plain;charset=UTF-8
Accept: / Referer: http://localhost:4200/dashboard Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

Запросить данные

{"dd":"dd"}

Вы можете показать свой запрос? включая заголовки, пожалуйста. (Обновите свой вопрос с ним)

Marcos Casagrande 30.05.2018 15:31
res.header("Access-Control-Allow-Origin", "*");res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); бессмысленны, поскольку вы используете промежуточное программное обеспечение cors.
Quentin 30.05.2018 15:33
Content-Type: text/plain, вероятно, должен быть Content-Type: application/json
Roland Starke 30.05.2018 15:38
Поведение ключевого слова "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) для оценки ваших знаний,...
7
3
14 778
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Вам необходимо отправить: Content-Type: application/json, чтобы bodyParser.json() работал, без него ваши данные JSON не будут проанализированы, поэтому вы получите: {}

Из документы:

The bodyParser object exposes various factories to create middlewares. All middlewares will populate the req.body property with the parsed body when the Content-Type request header matches the type option, or an empty object ({}) if there was no body to parse, the Content-Type was not matched, or an error occurred.

Пример использования .fetch:

fetch('http://localhost:4200/dashboard', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({dd: 'dd'})
});

Ваш заголовок типа содержимого - текстовый / простой. Пожалуйста, попробуйте заменить

app.use(bodyParser.json());

с участием

app.use(bodyParser.text());

Привет @Pradhaban Nandhakumar, я думаю, вам нужно передавать данные как данные строки. Попробуйте ниже фрагменты кода.

Вы всегда должны передавать необработанные данные.

app.post('/users', (req, res) => { res.send(req.body); });

Вы публикуете текстовую строку вместо JSON. Рассмотрите возможность показать нам, как вы публикуете данные (jQuery, Fetch API и т. д.).

Просто нужно указать

headers: {
  'Accept': 'application/json',
  'Content-Type': 'application/json'
}

в заголовках ваших запросов (интерфейс). После этого синтаксический анализатор тела Express должен определить действительный JSON и распечатать результат. Обратите внимание, что Accept не требуется, но он указывает серверу, что клиент понимает и принимает ответ JSON.

В качестве альтернативы можно использовать простую библиотеку, такую ​​как Easy Fetch, во внешнем интерфейсе для управления вызовами на стороне сервера без необходимости иметь дело с синтаксическим анализом ответа или настройками заголовка.

Обычно это происходит из-за заголовка Content-type в вашем http-запросе.

Тела JSON
bodyParser.json () принимает только тип «application / json» и отклоняет другие несоответствующие типы содержимого.

Решения 1. Принятие дополнительных типов контента, отличных от application/json

проверьте заголовок запроса «Content-type» и добавьте его в аргумент options в bodyParser.json ([options]) на сервере.

например, если у вас есть это:
"Content-type: application / csp-report"

app.use(bodyParser.json({ type: ["application/json", "application/csp-report"] }));

вы также можете использовать встроенное промежуточное ПО в exprss v4.16.0 и новее:

app.use(express.json({ type: ['application/json', 'application/csp-report'] }));

для получения дополнительной информации см. эта документация

Уведомление: используйте этот подход только там, где вы не можете изменить Content-type на application/json.

Решения 2 (рекомендуемые): измените заголовок content-type на application/json в Http-запросе.

А как насчет тел с urlencoded?
Это похоже на тела json с двумя отличиями:

  1. В запросе принят заголовок Content-type: application / x-www-form-urlencoded.

  2. полезная нагрузка тела представляет собой формат с кодировкой URL (не объект json):
    Формат: param_1 = значение_1 & param_2 = значение_2 & ...

app.use(express.urlencoded({ extended: false }));

см. документы.

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