Вопрос или проблема
Я использую следующее для отправки запроса на мой сервер express из приложения React:
const response = await fetch('http://localhost:3100/api', {
method: 'POST',
mode: 'no-cors',
headers: {
'Content-type': 'application/json'
},
// body: { "user":"1", "cmd":"Send NFT"},
body: JSON.stringify({ user: 1, cmd:"Send NFT"}),
})
Я попробовал использовать один из форматов тела
А на стороне nodejs с версией 4.21.1 express:
const express = require('express');
const app = express();
const port = 3100;
app.use(express.json());
app.get("https://stackoverflow.com/", (req, res) => {
res.send('Hello World!');
})
app.post('/api', (request, response) => {
console.log("Пользователь: " + JSON.stringify(request.body) );
if (request.body.user == 1) response.send(JSON.stringify({ user: 1, cmd: request.body.cmd}));
else if (request.body.user == 2) response.send(JSON.stringify({user: 2, cmd: "Информация от 1"}));
})
app.listen(port, () => {
console.log(`Пример приложения слушает на порту ${port}`)
})
Я получаю “Пользователь: {}”
Ответ или решение
Уважаемые коллеги,
Обработка POST-запросов с использованием JSON в Express может вызывать некоторые трудности, особенно если вы работаете с такими инструментами, как React. Давайте детально разберем вашу ситуацию с кодом, который вы предоставили, чтобы устранить проблему с пустым телом запроса.
Анализ проблемы
Ваша цель заключается в отправке POST-запроса с использованием fetch
из React в сервер на Express. Вы указали, что в ответ на запрос вы получаете пустое тело ("User: {}"
). На это могут влиять несколько факторов.
Основные аспекты
-
CORS: Использование параметра
mode: 'no-cors'
в вашем запросе может препятствовать правильной отправке заголовков и данных. Это один из наиболее частых источников проблем с POST-запросами. При использованииno-cors
браузер ограничивает ваш доступ к ответу и может не отправить запрос должным образом, из-за чего данные не достигают сервера. -
Содержимое тела запроса: Данные должны быть корректно сериализованы. Ваша строка кода
body: JSON.stringify({ user: 1, cmd: "Send NFT" })
выглядит правильно, однако нужно убедиться, что никаких проблем с сериализацией не возникает. -
Настройка Express: На стороне сервера необходимо убедиться, что Express правильно обрабатывает JSON. Вы уже используете
app.use(express.json())
, что является хорошей практикой.
Решение
Чтобы устранить идентифицированные проблемы, выполните следующие шаги:
- Измените
fetch
запрос:
const response = await fetch('http://localhost:3100/api', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ user: 1, cmd: "Send NFT" }),
});
Удалите mode: 'no-cors'
, чтобы сервер мог правильно обработать запрос и вернуть ответ.
- Проверьте сервер Express:
Убедитесь, что код вашего сервера выглядит следующим образом:
const express = require('express');
const app = express();
const port = 3100;
app.use(express.json());
app.get("/", (req, res) => {
res.send('Hello World!');
});
app.post('/api', (request, response) => {
console.log("User: ", request.body);
if (request.body.user === 1) {
response.json({ user: 1, cmd: request.body.cmd });
} else if (request.body.user === 2) {
response.json({ user: 2, cmd: "Info from 1" });
}
});
app.listen(port, () => {
console.log(`Example app listening on port ${port}`);
});
- Запустите сервер и тестируйте:
Теперь запустите ваш сервер и выполните запрос ещё раз из React-приложения. Проверьте консоль сервера на наличие ожидаемого вывода (например, User: {"user":1,"cmd":"Send NFT"}
).
Заключение
Следуя вышеописанным шагам, вы должны исправить проблему с получением пустого тела запроса. Если проблема сохраняется, убедитесь в отсутствии ошибок в консоли вашего браузера и в настройках CORS на стороне сервера.
Если у вас останутся вопросы или появятся дополнительные трудности, пожалуйста, не стесняйтесь обращаться за помощью! Удачи в разработке вашего приложения!