vue本地环境API代理和解决跨域
前言
我们在使用vue-cli启动项目的时候npm run dev便可以启动我们的项目了,通常我们的请求地址是以localhost:8080来请求接口数据的,localhost是没有办法设置cookie的。
我们可以在vue-cli配置文件里面设置一个代理,跨域的方法有很多,通常需要后台来进行配置。我们可以直接通过node.js代理服务器来实现跨域请求。
vue proxyTable接口跨域请求调试
在vue-cli项目中的config文件夹下的index.js配置文件中,dev长这样子:
dev: {
env: require('./dev.env'), port: 8080, autoOpenBrowser: true, assetsSubDirectory: 'static', assetsPublicPath: '/', proxyTable: {}, cssSourceMap: false
}
服务器提供的接口如果长这样https://www.exaple.com/server...,我们把域名提取出来如https://www.exaple.com;
在config中新建一个文件命名为proxyConfig.js :
module.exports = {
proxy: {
'/apis': { //将www.exaple.com印射为/apis target: 'https://www.exaple.com', // 接口域名 secure: false, // 如果是https接口,需要配置这个参数 changeOrigin: true, //是否跨域 pathRewrite: { '^/apis': '' //需要rewrite的, } }
}
}
如果本身的接口地址就有 '/api' 这种通用前缀,也就是说https://www.exaple.com/api,就可以把 pathRewrite 删掉。
config文件夹下的index.js引入proxyConfig.js:
var proxyConfig = require('./proxyConfig')
config文件夹下的index.js中的dev改成:
dev: {
env: require('./dev.env'), port: 8080, autoOpenBrowser: true, assetsSubDirectory: 'static', assetsPublicPath: '/', proxyTable: proxyConfig.proxy, cssSourceMap: false
}
重启项目npm run dev:
你会发现出现了这个
这个时候我们已经设置好了本地API代理了
修改本地hosts文件
window文件路径一般是C:WindowSystem32driversetc,mac则直接前往文件夹/etc/hosts,打开hosts文件,在这一段下面把localhost设置进去
localhost name resolution is handled within DNS itself.
127.0.0.1 localhost
::1 localhost
127.0.0.1 activate.adobe.com
127.0.0.1 practivate.adobe.com
127.0.0.1 lmlicenses.wip4.adobe.com
127.0.0.1 lm.licenses.adobe.com
127.0.0.1 na1r.services.adobe.com
127.0.0.1 hlrcv.stage.adobe.com
localhost www.exaple.com
搞定
此时我们已经完全解决了跨域问题,以及本地测试后台无法向我们本地环境设置cookie的情况了。
补充
上线地址是什么
写一个config.js文件,作为项目地址的配置。
如下:
//项目域名地址
const url = 'https://exaple.com';
let ROOT;
//由于封装的axios请求中,会将ROOT打包进去,为了方便之后不再更改,判断了当前环境,而生成的不同的ROOT
if (process.env.NODE_ENV === 'development') {
//开发环境下的代理地址,解决本地跨域跨域,配置在config目录下的index.js dev.proxyTable中 ROOT = "/apis"
} else {
//生产环境下的地址 ROOT = url;
}
exports.PROXYROOT = url; //代理指向地址
exports.ROOT = ROOT;
这里暴露出去了两个接口,一个作为代理指向地址,也就是真正的请求地址,一个则为我们的ajax请求的地址。
我们将ROOT引入我们配置的ajax中,再将proxyConfig.js修改如下:
const config = require("../src/fetch/config"); //路径你们改下
module.exports = {
proxy: {
[config.ROOT]: { //将www.exaple.com印射为/apis target: config.PROXYROOT,, // 接口域名 secure: false, // 如果是https接口,需要配置这个参数 changeOrigin: true, //是否跨域 pathRewrite: { [`^${config.ROOT}`]: '' //需要rewrite的 } }
}
}
之后不管是生产环境,还是开发环境,都不用再修改我们的请求地址了。
写的比较潦草,没有整理思路,总结一下。
也就是说,之前我们的方法,在npm run dev的时候,ajax请求接口地址需要带上/apis,而如果我们在npm run build的时候,则需要将ajax接口地址改为真正的地址www.exaple.com,这样极其不方便,每次都要改。那我们便通过process.env.NODE_ENV来判断环境,从而导出不一样的接口。