问题描述
如果是前后端分离的项目,本地开发环境需要访问mock,或者在调试时直接访问线上的接口,这时候就会有接口跨域的问题(mock不存在跨域问题,但是用这个方法配置起来方便,姑且算是一个问题)。以vue-cli生成的项目为例,需要配置 config/index.js 中的 proxyTable 属性,大概如下:
proxyTable: { '/pc/my/list/': { target: 'http://10.132.20.14:8083/mockjsdata/66', pathRewrite: { '^/pc/my/list/': '/pc/my/list/' } } },
配置规则在网上搜proxyTable就能搜到,这里不做赘述。今天要说的是另一个问题,请见下面的代码:
proxyTable: { '/m/userinfo/': { target: 'http://10.132.20.14:8083', pathRewrite: { '^/m/userinfo/': '/mockjsdata/66/m/userinfo/' } }, '/m/my/ajax/list/': { target: 'http://10.132.20.14:8083', pathRewrite: { '^/m/my/ajax/list/': '/mockjsdata/66/m/my/ajax/list/' } }, '/m/tkpreinterview':{ target: 'http://10.132.20.14:8083', pathRewrite: { '^/m/tkpreinterview': '/mockjsdata/66/m/tkpreinterview' } }, '/m/preinterview':{ target: 'http://10.132.20.14:8083', pathRewrite: { '^/m/preinterview': '/mockjsdata/66/m/preinterview' } }, '/m/interview':{ target: 'http://10.132.20.14:8083', pathRewrite: { '^/m/interview': '/mockjsdata/66/m/interview' } }, '/m/checkLogin':{ target: 'http://10.132.20.14:8083', pathRewrite: { '^/m/checkLogin': '/mockjsdata/66/m/checkLogin' } }, '/m/my/ajax/vdetail/':{ target: 'http://10.132.20.14:8083', pathRewrite: { '^/m/my/ajax/vdetail/': '/mockjsdata/66/m/my/ajax/vdetail/' } } },
明明一句(见下)就能解决的问题,为什么要写成这个样子?难道就是因为使用者没有学好?
proxyTable:{ '/m':{ target: 'http://10.132.20.14:8083/mockjsdata/66' } },
事情当然没这么简单。原因是,后端在设计接口时,没有把api和模板分开,都在一个命名空间下(比如,首页的地址是 /m/index)。这时候,如果按照上面那样配置,连模板接口也会被代理掉,所以只能一个一个的写,实在是前端在给后端背锅啊!那么有没有更优雅的办法呢?比如exclude之类的?
我们发现,实现代理功能的插件是http-proxy-middleware,在文档中我们发现了这一段:
proxy('**', {...}) matches any path, all requests will be proxied.proxy('**/*.html', {...}) matches any path which ends with .htmlproxy('/*.html', {...}) matches paths directly under path-absoluteproxy('/api/**/*.html', {...}) matches requests ending with .html in the path of /apiproxy(['/api/**', '/ajax/**'], {...}) combine multiple patternsproxy(['/api/**', '!**/bad.json'], {...}) exclusion
注意最后一条,此插件是支持exclude的。以我们上面的例子来说,只要key的值写成类似 ['/m/**' , '!/m/index'] 这样的就行了。可是!你见过object的key是个array的吗?好吧,不啰嗦,直接看源码。
新闻热点
疑难解答
图片精选