Это мой код 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"}
res.header("Access-Control-Allow-Origin", "*");res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); бессмысленны, поскольку вы используете промежуточное программное обеспечение cors.
Content-Type: text/plain, вероятно, должен быть Content-Type: application/json


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам необходимо отправить: 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 с двумя отличиями:
В запросе принят заголовок Content-type: application / x-www-form-urlencoded.
полезная нагрузка тела представляет собой формат с кодировкой URL (не объект json):
Формат: param_1 = значение_1 & param_2 = значение_2 & ...
app.use(express.urlencoded({ extended: false }));
см. документы.
Вы можете показать свой запрос? включая заголовки, пожалуйста. (Обновите свой вопрос с ним)