Как преодолеть проблему CORS в ReactJS
Я пытаюсь сделать вызов API через Axios в моем приложении React.Тем не менее, я получаю эту проблему CORS в своем браузере. Мне интересно, могу ли я решить эту проблему с клиентской стороны, поскольку у меня нет никакого доступа к API внутри.Прилагается мой код.
const response = axios({
method: 'post',
dataType: 'jsonp',
url: 'https://awww.api.com',
data: {
'appToken':'',
'request':{
'applicationName':'ddfdf',
'userName':'jaime@dfd.com',
'password':'dfd',
'seasonIds':[1521ddfdfd5da02]
}
}
});
return{
type:SHARE_REVIEW,
payload:'response'
}
}
прилагается мой WebPack.конфиг.js
module.exports = {
entry: [
'./src/index.js'
],
output: {
path: __dirname,
publicPath: '/',
filename: 'bundle.js'
},
module: {
loaders: [{
exclude: /node_modules/,
loader: 'babel',
query: {
presets: ['react', 'es2015', 'stage-1']
}
},
{ test: /.json$/, loader: "json-loader"}]
},
resolve: {
extensions: ['', '.js', '.jsx']
},
devServer: {
historyApiFallback: true,
contentBase: './'
},
node: {
dns: 'mock',
net: 'mock'
},
};
4 ответов
идеальным способом было бы добавить поддержку CORS на ваш сервер.
вы также можете попробовать использовать отдельную JSONP в модуль. Насколько я знаю, axios не поддерживает jsonp. Поэтому я не уверен, что метод, который вы используете, будет квалифицироваться как действительный запрос jsonp.
существует еще одна хакерская работа вокруг проблемы CORS. Вам придется развернуть свой код с сервером nginx, служащим прокси-сервером как для вашего сервера, так и для вашего клиента. То, что будет сделайте трюк нам
временное решение этой проблемы с помощью плагина chrome под названием CORS. Btw backend server должен отправлять правильный заголовок на запросы переднего плана.
другой способ, кроме @Nahushответ, если вы уже используете Express framework в проекте вы можете избежать использования Nginx для обратного прокси-сервера.
более простой способ-использовать express-http-proxy
-
run
npm run build
создать пакет.var proxy = require('express-http-proxy'); var app = require('express')(); //define the path of build var staticFilesPath = path.resolve(__dirname, '..', 'build'); app.use(express.static(staticFilesPath)); app.use('/api/api-server', proxy('www.api-server.com'));
используйте "/ api / you-server " из кода react для вызова API.
Итак, этот браузер отправит запрос к тому же хосту, который будет внутренне перенаправляя запрос на другой сервер, браузер будет чувствовать, что он исходит из того же источника;)
вы можете настроить прокси-сервер express с помощью http-proxy-middleware чтобы обойти CORS:
const express = require('express');
const proxy = require('http-proxy-middleware');
const path = require('path');
const port = process.env.PORT || 8080;
const app = express();
app.use(express.static(__dirname));
app.use('/proxy', proxy({
pathRewrite: {
'^/proxy/': '/'
},
target: 'https://server.com',
secure: false
}));
app.get('*', (req, res) => {
res.sendFile(path.resolve(__dirname, 'index.html'));
});
app.listen(port);
console.log('Server started');
из вашего приложения react все запросы должны быть отправлены в /proxy конечная точка, и они будут перенаправлены к нужному серверу.
const URL = `/proxy/${PATH}`;
return axios.get(URL);