Я пытаюсь выполнить почтовый вызов из своего приложения для реагирования, используя приведенный ниже код.
writeToFile = (data = {}) => {
let url = "http://localhost:8000/write";
console.info(data);
return fetch(url, {
method: 'post',
headers: {
'Accept': 'application/json, text/plain, */*',
'Content-Type': 'application/json'
},
body: JSON.stringify({"content": "some content"})
}).then(res=>res.json())
.then(res => console.info(res));
}
Однако это дает мне следующую ошибку:
Такой же запрос работает в почтальоне (приложение для тестирования API). Это запрос типа application/json, ожидающий ответа того же типа.
Изменить 1:
Так выглядит запрос на POSTMAN: 
В том же приложении запрос GET (ниже кода) работает нормально:
readFromFile = () => {
fetch('http://localhost:8000/read')
.then(function(response) {
return response.json();
})
.then((myJson) => {
console.info(myJson.content);
this.setState({messages: this.state.messages.concat({content: myJson.content, type: 'received'})});
console.info(this.state.messages);
});
}
Соответствующий код на стороне сервера:
function writeToFile(request, response) {
var body = '';
request.on('data', function (data) {
body += data;
// Too much POST data, kill the connection!
// 1e6 === 1 * Math.pow(10, 6) === 1 * 1000000 ~~~ 1MB
if (body.length > 1e6)
request.connection.destroy();
});
request.on('end', function () {
// const dataToWrite = JSON.parse(body)["content"];
// console.info(dataToWrite);
myFileModule.fileWriter(JSON.parse(body)["content"]);
response = allowCORS(response);
response.writeHead(200, {'Content-Type': 'application/json'});
response.write(JSON.stringify({ content: "success..." }));
response.end();
});
}
function postRequestHandler(request, response) {
var path = url.parse(request.url).pathname;
switch (path) {
case '/write':
writeToFile(request, response);
break;
default:
response = allowCORS(response);
response.writeHead(404, {'Content-Type': 'application/json'});
response.write(JSON.stringify({ content: "Path not defined" }));
response.end();
break;
}
}
function allowCORS(response) {
response.setHeader('Access-Control-Allow-Origin', '*');
response.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); // If needed
response.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type'); // If needed
response.setHeader('Access-Control-Allow-Credentials', true); // If needed
return response;
}
@SureshPrajapati обновил мой вопрос. Добавлен фрагмент почтового запроса через приложение почтальон.
Ваш сервер API и клиентское приложение работают на другом хосте: порту? также, что вы используете на внутреннем сервере (nodejs?). Возможно, вам нужно разрешить CORS из бэкэнда
@SureshPrajapati Да. Сервер находится на post:8000, а клиентское приложение - на port:3000. Я также использую get request в другом месте того же приложения, которое работает нормально. У меня проблема только с почтовым запросом. В моем серверном приложении Node.js я разрешил CORS, поэтому запрос на получение работает.
Какую структуру использует ваш сервер API?
Сервер API @SureshPrajapati использует простой node.js
с экспресс в качестве рамки? или что-то другое?
Позвольте нам продолжить обсуждение в чате.
@SureshPrajapati Без использования внешней структуры, только Node.js
Вам нужно поделиться своим внутренним кодом, чтобы включить CORS, или, если он включен, возможно, вам придется проверить, почему он возвращает 404 (возможно, что-то пропущено)
Ваша функция allowCORS должна запускаться для каждого запроса, прежде чем он дойдет до любого обработчика (здесь - writeToFile). Так что OPTIONS req преуспеет со всем необходимым заголовком и браузером, затем инициирует POST req



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


Если вы используете модуль http для создания сервера, попробуйте:
var server;
server = http.createServer(function(req,res){
// Set CORS headers
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Request-Method', '*');
res.setHeader('Access-Control-Allow-Methods', 'OPTIONS, GET, POST, PATCH, DELETE, PUT');
res.setHeader('Access-Control-Allow-Headers', '*');
if ( req.method === 'OPTIONS' ) {
res.writeHead(200);
res.end();
return;
}
// ...
});
Кажется, проблема с CORS? Какое сообщение вы получаете через почтальон?