使用 http-proxy-middleware 配置 setupProxy.js

Posted

技术标签:

【中文标题】使用 http-proxy-middleware 配置 setupProxy.js【英文标题】:Configuring setupProxy.js using http-proxy-middleware 【发布时间】:2019-06-14 07:53:33 【问题描述】:

我正在尝试使用 HTTP-proxy-middleware 在 create-react-app 中配置代理服务器 ( setupProxy.js ) 以访问天气数据 API ( api.darksky.net )。

我按照 React 文档 (https://facebook.github.io/create-react-app/docs/proxying-api-requests-in-development#configuring-the-proxy-manually) 中的步骤操作,但仍然遇到 CORS 问题。

我已经尝试在我的 fetch 调用中使用 'https://cors-anywhere.herokuapp.com/' (https://github.com/Rob--W/cors-anywhere/) 预先添加我的 API URL,这是可行的,但对我来说感觉有点老套,我宁愿自己让它工作。

这是最终从 componentDidMount 中调用的函数:

  fetchWeatherDataAuto = () => 
    let lat = this.state.locInfo.lat;
    let lon = this.state.locInfo.lon; 

    fetch(`https://api.darksky.net/forecast/$apiKey.darkSky_key/$lat,$lon`)
      .then(response => response.json())
      .then(response => console.log("Weather Response: ", response));
  

这是我的 setupProxy.js 文件的代码:

const proxy = require('http-proxy-middleware');

module.exports = function(app) 
    app.use(proxy("/forecast", 
          target: "https://api.darksky.net/",
          changeOrigin: true
    ));

此错误显示在我的控制台中:

跨源请求被阻止:同源策略不允许读取 >https://api.darksky.net/forecast/myAPIKey/9.739>9056,-82.8484079 处的远程资源。 (原因:CORS 标头“Access-Control-Allow-Origin”>缺失)。

【问题讨论】:

【参考方案1】:

这种情况下不需要设置自定义代理...

只需将其添加到您的 package.json 中:


  "name": "test1",
  "version": "0.1.0",
  "private": true,
  "dependencies": 
    "react": "^16.7.0",
    "react-dom": "^16.7.0",
    "react-scripts": "2.1.3"
  ,
  "proxy": "https://api.darksky.net", // <= add this here...
  "scripts": 
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  ,
  "eslintConfig": 
    "extends": "react-app"
  ,
  "browserslist": [
    ">0.2%",
    "not dead",
    "not ie <= 11",
    "not op_mini all"
  ]

然后在你的 App.js 中

  componentDidMount() 
    fetch(`/forecast/$YOUR_API_KEY_HERE/$lat,$lon`)
      .then(response => response.json())
      .then(response => console.log('Weather Response: ', response));
  

它应该可以工作......(注意所有异步调用都应该在 componentDidMount 生命周期方法中完成......)

【讨论】:

成功。看来我错过了 package.json 中的属性。根据我在其他线程中阅读的内容,建议应该从 package.json 删除 'proxy' 属性,只留下代理服务器( setupProxy.js )。 @RashidIqbal 用于开发,正如它在文档中所述... @SakoBu,如何使用托管应用解决此问题,我的应用托管在 Firebase 托管中 @RashidIqbal 您可以编写一个简单的代理服务器或更好的(因为您已经在 GCC 生态系统中)一个获取数据然后将其转发给客户端的云功能...... CORS 是一个浏览器向服务器发出服务器它将工作......【参考方案2】:

代理在你的代码中放置错误,试试这个

app.use("/forecast", 
   proxy(
      target: "https://api.darksky.net/",
      changeOrigin: true
   )
);

【讨论】:

以上是关于使用 http-proxy-middleware 配置 setupProxy.js的主要内容,如果未能解决你的问题,请参考以下文章

React18使用 http-proxy-middleware代理跨域

React axios 使用 http-proxy-middleware 解决跨域问题小记

使用axios以及http-proxy-middleware代理处理跨域的问题

node.js中使用http-proxy-middleware请求转发给其它服务器

在使用 http-proxy-middleware 代理到 websocket 服务器之前,如何进行一些验证?

创建 React App http-proxy-middleware 不工作