记录axios响应慢的问题以及vue跨域和nginx跨域区别

当我没有打开后端服务时,我去yarn serve运行前端项目
当然是请求不到数据的,但是他的请求时间居然很长才得到响应。
在这里插入图片描述
即使我在这里设置超时时间也没用

// 创建 axios 实例
const request = axios.create({
  // API 请求的默认前缀
  baseURL: process.env.VUE_APP_API_BASE_URL,
  timeout: 3000 // 请求超时时间
})

尝试将vue.config.js里的跨域配置注释掉

'/api': {
  target: 'http://10.34.37.58:8080',
  ws: false,
  changeOrigin: true,
  pathRewrite: {
      '^/api': ''
  }
}

ok,就解决了,原来他一直都在尝试将请求代理到目标主机,阻塞在这里。

vue.config.js 跨域配置

devServer的proxy是为了简化开发环境下的跨域请求配置。
Vue配置的代理仅在本地开发下有效,部署之后在生产环境是无效的。

  devServer: {
    port: 8000,		// development server port 8000
    proxy: {
      '/api': {
        target: 'http://10.34.37.58:8080',
        ws: false,				// if proxy websockets.
        changeOrigin: true,		// Default: false - changes the origin of the host header to the target URL.
        pathRewrite: {			// Rewrite target's url path. Object-keys will be used as RegExp to match paths.
            '^/api': ''			// 将路径中的 '/api' 消去
        }
      }
    }
  }
实际作用:('/api' 前面的路径进行代理重写, 并消去 '/api' )
将请求: http://localhost:8000/api/role/list
代理到: http://10.34.37.58:8080/role/list

nginx 跨域配置

配置devServer不能解决生产环境跨域问题。它解决的是开发环境的跨域问题。

devServer只是一个webpack插件,只能用于开发环境。
使用webpack-dev-server(简称wds)进行开发时,wds启动了一个运行在node上的web服务器,此时开发环境访问对应的端口时,浏览器返回的vue页面是wds处理后的结果。
devServer的proxy是为了简化开发环境下的跨域请求配置。当发现符合在devServer proxy中配置好的请求格式时,将该请求拦截下来,由自己去请求服务器获取响应,然后把该响应返回给前端页面,即相当于一个传话筒。(正向代理)
编译打包后,前端页面成为了单独的静态资源,wds被抽离出去了。但是资源要被访问,那必然还是需要有另一个web服务器来装载它,这个服务器常见的就是nginx。

# nginx 跨域配置
location /prod-api/ {
	proxy_set_header Host $http_host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header REMOTE-HOST $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	proxy_pass http://192.168.31.101:8080/;
}

npm run serve

npm run serve实际上会执行vue-cli-service serve,该文件位于.bin\vue-cli-service.cmd,查看该文件,发现最终会执行node vue-cli-service.js serve(该文件位于@vue\cli-service\bin\vue-cli-service.js)。
vue-cli-service.js就是我们的切入口。
关键代码:

const Service = require('../lib/Service')
//...
const service = new Service(...
//...
service.run(command, args, rawArgv).catch(err => {
  error(err)
  process.exit(1)
})

实际执行的文件为serve.js(该文件位于@vue\cli-service\lib\commands\serve.js)
关键代码:

const WebpackDevServer = require('webpack-dev-server')
//...
const webpackConfig = api.resolveWebpackConfig()
//...
const compiler = webpack(webpackConfig)
const server = new WebpackDevServer(compiler, ...
//...
server.listen(port, host, err => {
  if (err) {
    reject(err)
  }
})

serve.js中使用webpack-dev-server作为http服务器,启动并监听端口提供服务。
vue.config.js的配置会作用到webpack-dev-server上。
devServer_proxy
devServer的proxy打包后失效

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Axios是一个基于Promise的HTTP客户端,可以用于浏览器和Node.js。Vue中使用Axios可以方便地进行HTTP请求。在Vue中使用Axios进行跨域请求,可以通过以下两种方式解决: 1. 在Vue中进行配置 可以在Vue的配置文件中设置Axios的默认配置,包括跨域请求的相关配置。具体步骤如下: ① 安装Axios ```shell npm install axios --save ``` ② 在main.js中引入Axios并进行配置 ```javascript import axios from 'axios' // 设置Axios的默认配置 axios.defaults.baseURL = 'http://localhost:8080' // 设置请求的基础URL axios.defaults.timeout = 5000 // 设置请求超时时间 // 设置Axios跨域请求相关配置 axios.defaults.withCredentials = true // 允许携带cookie axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded' // 设置POST请求的请求头 // 将Axios挂载到Vue的原型上,方便在组件中使用 Vue.prototype.$axios = axios ``` ③ 在组件中使用Axios进行跨域请求 ```javascript this.$axios.get('/api/user', { params: { id: 1 } }).then(res => { console.log(res.data) }).catch(err => { console.log(err) }) ``` 2. 使用Nginx转发 可以使用Nginx作为反向代理服务器,将Vue的请求转发到后端服务器上,从而实现跨域请求。具体步骤如下: ① 安装Nginx ```shell sudo apt-get install nginx ``` ② 配置NginxNginx的配置文件中添加以下内容: ```nginx server { listen 80; server_name localhost; location /api { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } ``` 其中,`/api`是Vue的请求路径,`http://localhost:8080`是后端服务器的地址。 ③ 在组件中使用Axios进行跨域请求 ```javascript this.$axios.get('/api/user', { params: { id: 1 } }).then(res => { console.log(res.data) }).catch(err => { console.log(err) }) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值