Пустое тело в почтовом запросе на выборку

Я борюсь с 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)
})

Проблема в том, что на стороне СЕРВЕРА тело запроса пусто. Кто-нибудь может мне помочь? Спасибо !

Вы хотите сказать, что ответ от вашего экспресс-сервера пуст? Или запрос на сервере пустой?

skellertor 03.01.2019 04:50

Запрос на сервере пуст.

Trietch 03.01.2019 05:11

кажется правильным запросом, возможно, ваш сервер не может его проанализировать. проверьте на сервере, что он ожидает.

Just code 03.01.2019 05:22

Почему mode: 'no-cors'?

Phil 03.01.2019 05:33

Я использую режим no-cors, потому что без него у меня появляется ошибка «Нет заголовка Access-Control-Allow-Origin» в запрошенном ресурсе ». Но я только что увидел ваш ответ, спасибо, я исследую, как решить эту ошибку без использования этого режима.

Trietch 03.01.2019 05:40

Похоже, браузер меняет тип контента на text/plain

skellertor 03.01.2019 06:04

Я не указываю mode = no-cors, и у меня такая же проблема

Zach Smith 20.10.2019 14:56
Поведение ключевого слова "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) для оценки ваших знаний,...
18
7
24 073
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

Проблема в том

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 ()). Большое спасибо!

jbernardo 19.12.2019 22:58

Не совсем то, что я искал, но второй метод действительно работал у меня с xml.

lazzy_ms 27.07.2020 08:52

См. Документ Режим, режим 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 в тело

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