React Proxy代理的坑

  • Post author:
  • Post category:其他


1.新旧版本问题

React的Proxy分为新旧版本,如何确定呢,npm包之后在require(‘http-proxy-middleware’)后ctrl+鼠标左键进入http-proxy-middleware,旧版本长这样

var HPM = require('./lib')

module.exports = function(context, opts) {
  return new HPM(context, opts)
}

新版本长这样

import { Filter, Options } from './types';
export declare function createProxyMiddleware(context: Filter | Options, options?: Options): import("./types").RequestHandler;
export * from './handlers';
export { Filter, Options, RequestHandler } from './types';

旧版本的配置

const proxy = require('http-proxy-middleware')
module.exports = function(app) {
  app.use(
      proxy('/api', {
          target: 'http://localhost:8080',
          changeOrigin: true,
          pathRewrite: {'^/api': ''}
      })
  )
}

新版本的配置

const {createProxyMiddleware} = require('http-proxy-middleware')

module.exports = function(app) {
    
    app.use(
        createProxyMiddleware('/a1', {
            target: 'http://www.baidu.com',
            changeOrigin: true,
            pathRewrite: {'^/a1': ''}
        })
    )
}

如果按自己的版本配置之后还是不行,可能是npm的包引错了,可以调换一下试试,升级或降低版本应该能解决问题。

2.路径问题:

最坑人的来了,参数中的代理路径不是模糊匹配,是精准匹配,例如你访问

http://localhost:3000/api/a/b/c/d

是触发不到以下的代理的

const proxy = require('http-proxy-middleware')
module.exports = function(app) {
  app.use(
      proxy('/api', {
          target: 'http://localhost:8080',
          changeOrigin: true,
          pathRewrite: {'^/api': ''}
      })
  )
}

只有访问的是以下的才可以

http://localhost:3000/api

解决办法:加一个方法,方法中设置模糊匹配

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

module.exports = function(app) {
    const filter = function (pathname, req) {
        return pathname.match('^/a1') && req.method === 'GET';
    };
    app.use(
        proxy (filter, {
            target: 'http://www.baidu.com',
            changeOrigin: true,
            pathRewrite: {'^/a1': ''}
        })
    )
}

或者直接访问

http://localhost:3000/api

这种自定义路径来取值也是可以的,反正都是走的代理。这里localhost:3000是你要代理的域名地址。target是真正打到的地址。

随时更新中。。。



版权声明:本文为weixin_42853017原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。