Я борюсь с API получения в javascript. Когда я пытаюсь отправить что-то на свой сервер с помощью fetch, тело запроса представляет собой пустой массив. Но когда я использую Postman, он работает ... Вот мой серверный код в NodeJS:
const express = require('express')
const app = express()
const port = 3000
app.use(express.json())
app.post('/api', function (req, res) {
console.info(req.body)
})
app.listen(port)
а вот и мой клиент:
fetch('http://"theserverip":3000/api', {
method: 'POST',
headers: { "Content-Type": "application/json" },
mode: 'no-cors',
body: JSON.stringify({
name: 'dean',
login: 'dean',
})
})
.then((res) => {
console.info(res)
})
Проблема в том, что на стороне СЕРВЕРА тело запроса пусто. Кто-нибудь может мне помочь? Спасибо !
Запрос на сервере пуст.
кажется правильным запросом, возможно, ваш сервер не может его проанализировать. проверьте на сервере, что он ожидает.
Почему mode: 'no-cors'?
Я использую режим no-cors, потому что без него у меня появляется ошибка «Нет заголовка Access-Control-Allow-Origin» в запрошенном ресурсе ». Но я только что увидел ваш ответ, спасибо, я исследую, как решить эту ошибку без использования этого режима.
Похоже, браузер меняет тип контента на text/plain
Я не указываю mode = no-cors, и у меня такая же проблема



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


Проблема в том
mode: 'no-cors'
От документация ...
Prevents the method from being anything other than HEAD, GET or POST, and the headers from being anything other than simple headers
Ограничение заголовка типа содержимого просто позволяет
text/plain,application/x-www-form-urlencoded иmultipart/form-dataЭто приводит к тому, что ваш красиво созданный заголовок Content-Type: application/json становится content-type: text/plain (по крайней мере, при тестировании через Chrome).
Поскольку ваш сервер Express ожидает JSON, он не будет анализировать этот запрос.
Я рекомендую опустить конфиг mode. Вместо этого используется опция "cors" по умолчанию.
Поскольку ваш запрос не просто, вы, вероятно, захотите добавить ПО промежуточного слоя CORS на свой сервер Express.
Другой (немного хакерский) вариант - сказать Express, чтобы он анализировал запросы text/plain как JSON. Это позволяет вам отправлять строки JSON в виде простых запросов, которые также могут избежать предполетного запроса OPTIONS, тем самым снижая общий сетевой трафик ...
app.use(express.json({
type: ['application/json', 'text/plain']
}))
Обновлено: добавлены закрывающие скобки в окончательный блок кода app.use.
Ну наконец то! Я получил его, просто добавив cors lib "yarn add cors", а в файле app.js я добавил: app.use (cors ()). Большое спасибо!
Не совсем то, что я искал, но второй метод действительно работал у меня с xml.
См. Документ Режим, режим no-cors отправляет только простые заголовки. Таким образом, Content-Type изменяется на text/html; вместо application/json, поэтому ваш сервер не может распознать формат тела и вернуть пустой.
Удалите mode: 'no-cors',, и все будет в порядке.
Чтобы дополнить отличные ответы, в которых упоминалось удаление опции mode: 'no-cors', и если вам не хочется добавлять ПО промежуточного слоя CORS в Express, вы можете просто обрабатывать «предполетные» запросы в блоке OPTIONS:
app.options('*', (req, res) => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); // Add other headers here
res.setHeader('Access-Control-Allow-Methods', 'POST'); // Add other methods here
res.send();
});
Еще один хороший ответ: https://www.vinaygopinath.me/blog/tech/enable-cors-with-pre-flight/
Надеюсь это поможет!
у меня ничего не работает Я решил эту проблему с помощью промежуточного программного обеспечения
app.use(restify.plugins.bodyParser());
или
app.use(multer().array())
Многие из приведенных выше ответов не решали мою проблему, поэтому любому, кто столкнется с этой проблемой, может потребоваться сделать то, что мне нужно, и разрешить их app читать JSON в теле, поскольку приложение не может этого сделать с помощью по умолчанию, что приводит к пустому телу
Я решил это, добавив:
app.use(bodyParser.json());
Запросы POST / PUT отправили тело без проблем после добавления этой строки
Технически модуль bodyParser устарел, поэтому это не самое идеальное решение, но если добавление указанной выше строки в код заставляет его работать, то вы, по крайней мере, знаете, что ваша проблема заключается в том, как ваше приложение может анализировать / читать JSON в тело
Вы хотите сказать, что ответ от вашего экспресс-сервера пуст? Или запрос на сервере пустой?