开发者问题收集

ReactJS Axios Nginx CORS 问题

2020-05-28
2337

我正在使用 React 15.6.1、Axios、NGINX 。我在登录时遇到 CORS 问题。以下是登录 axios POST 调用

const additionalHeaders = {
  code: action.payload,
  page: 'login'
};
const loginData = yield call(() =>
  axios(authorization, 'Basic', additionalHeaders).post(
    URL + ACCESS_TOKEN_URL,
    params
  )
);

以下是错误控制台

Access to XMLHttpRequest at '..../oauth/token' from origin 'http://localhost:3000' 
has been blocked by CORS policy: Request header field sourcepage is not allowed by 
Access-Control-Allow-Headers in preflight response.
utils.js:258 uncaught at tryLogin 
 at takeLatestHelper 
 at login 
 TypeError: Cannot read property 'data' of undefined
    at login$ (webpack-internal:///./app/containers/Login/saga.js:137:43)
    at tryCatch (webpack:///./node_modules/regenerator-runtime/runtime.js?:65:40)
    at Generator.invoke [as _invoke] (webpack:///./node_modules/regenerator-runtime/runtime.js?:303:22)
    at Generator.prototype.<computed> [as throw] (webpack:///./node_modules/regenerator-runtime/runtime.js?:117:21)
    at next (webpack:///./node_modules/redux-saga/es/internal/proc.js?:289:32)
    at currCb (webpack:///./node_modules/redux-saga/es/internal/proc.js?:387:7)
    at eval (webpack:///./node_modules/redux-saga/es/internal/proc.js?:443:14)
..
..
xhr.js:160 POST .../aas/oauth/token net::ERR_FAILED

以下是我尝试过的,但没有用。

我有 NGINX 配置。我已为 Access-Control-Allow-Origin 添加了 add_header 参数

 # Always serve index.html for any request
location / {
  add_header 'Access-Control-Allow-Origin' "*";
  add_header 'Access-Control-Allow-Credentials' 'true';
  add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, PATCH, DELETE, OPTIONS';
  add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With';
  # Set path
  root /var/www/;
  try_files $uri /index.html;

}

并且我们有 3 个 nodejs middleWare 文件 frontendMiddleWare.jsdevMiddleware.jsprodMiddleWare.js ,我已在 fontendMiddleware 中添加了以下访问权限

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
  next();
});

我在客户端找不到更多解决方案,仍然无法解决问题。

编辑:此问题第二次出现。我第一次能够看到具有 200 响应的令牌并且可以正常工作。当我尝试登录时加载应用程序时,它将再次尝试获取令牌。此时 CORS 问题出现了。

3个回答

我们可以在 package.json 文件中创建一个代理,如果前端没有路由,它将调用后端服务器。我们可以在 package.json 中添加一个名为 proxy 的键,并将后端 api 作为值

proxy: http://localhost:PORT_NUMBER_OF_BACKEND

Remember to stop the react server and start it again for this to work

来源 https://create-react-app.dev/docs/proxying-api-requests-in-development/

在这种情况下,我们不会出现 cors 错误,在生产中,我们可以生成构建并将其放在网站后端的公共文件夹中,因此生产中不会出现任何 cors 问题。

Vinod Sai
2020-05-28

您可以在应用程序中添加 cors 包,首先您应该安装 cors 包 npm install cors --save ,然后执行以下操作:

const cors = require('cors');
app.use(cors());

删除您在 Nginx conf 和中间件文件上放置的所有其他额外标头。

希望它能起作用

Hashemi Rafsan
2020-05-28

您可以使用 fruitcake/laravel-cors 包来引发异常并修复 api 路由。

Q8root
2020-05-28