解决Nuxt使用axios跨域问题


Posted in Javascript onJuly 06, 2020

Nuxt 是 Vue 项目服务器端渲染(SSR)解决方案。而在使用时,就会遇到前后端分离情况下的域名或端口不一致导致的跨域问题。本文将介绍如何通过设置代理解决 Nuxt 与 axios 集成的跨域问题。

解决跨域

Nuxt 使用 axios 为避免出现前端页面跨域问题,需要安装 @nuxtjs/axios 和 @nuxtjs/proxy 两个模块。

用 yarn 安装:

yarn add axios @nuxtjs/axios @nuxtjs/proxy

使用 npm 安装:

npm install axios @nuxtjs/axios @nuxtjs/proxy

注意:不需要手动注册 @nuxtjs/proxy 模块,但是必须要确保它在依赖项中。

安装完成后在 nuxt.config.js 文件里面添加以下配置:

module.exports = {
 /*
  ** Nuxt.js modules
  */
 modules: ["@nuxtjs/axios"],
 /*
  ** axios proxy
  */
 axios: {
  proxy: true
 },
 /*
  ** proxy
  */
 proxy: {
  "/api": "http://localhost:3000"
 },
 /*
  ** Build configuration
  ** See https://nuxtjs.org/api/configuration-build/
  */
 build: {
  vendor: ["axios"]
 }
}

到此,代理设置完成,可以测试以下跨域问题是否解决。

扩展 axios

创建 nuxt 插件,更改全局配置全局配置自定义 axios,在 plugins/ 目录下新建 axios.js 文件:

// plugins/axios.js
export default function({ $axios, redirect }) {

 $axios.onResponse(res => {
  return res.data
 })

 $axios.onError(error => {
  const code = parseInt(error.response && error.response.status);
  if (code === 400) {
   redirect("/400");
  }
 });
}

在 nuxt.config.js 中配置 axios.js 插件:

module.exports = {
 /*
  ** Plugins to load before mounting the App
  ** https://nuxtjs.org/guide/plugins
  */
 plugins: ["@/plugins/axios"],
}

使用 axios 插件

通过上面的设置后,使用 axios 插件需要注意的是在 asyncData 内和在 asyncData 外的使用是所不同的。

** 在 asyncData 里使用:**

async asyncData({ $axios }) {
 const ip = await $axios.get('http://icanhazip.com')
 return { ip }
}

** 在 asyncData 外使用:**

methods: {
 async fetchSomething() {
  const ip = await this.$axios.get('http://icanhazip.com')
  this.ip = ip
 }
}

更多关于 Nuxt 与 axios 的集成介绍可以查看官方文档——Axios模块。

附录:nuxt使用axios的跨域处理配置

npm i axios qs
npm i @nuxtjs/axios @nuxtjs/proxy --save-dev

plugins/axios.js

使用qs将请求从参数转化位字符串

import qs from "qs";
 
export default function({ $axios, redirect }) {
 $axios.onRequest(config => {
  config.data = qs.stringify(config.data, {
   allowDots: true //Option allowDots can be used to enable dot notation
  });
  return config;
 });
 
 $axios.onResponse(response => {
  return Promise.resolve(response.data);
 });
 
 $axios.onError(error => {
  return Promise.reject(error);
 });
}

nuxt.config.js 

plugins: [
  { src: "~plugins/axios.js", ssr: true },
 ],
 //处理跨域问题
 modules: ["@nuxtjs/axios", "@nuxtjs/proxy"],
 axios: {
  retry: { retries: 3 },
  //开发模式下开启debug
  debug: process.env._ENV == "production" ? false : true,
  //设置不同环境的请求地址
  baseURL:
   process.env._ENV == "production"
    ? "http://localhost:3000/api"
    : "http://localhost:3000/api",
  withCredentials: true,
 },
 proxy: {
  //开启代理
  "/api/": {
   target: "http://192.168.1.2:10086/v1",
   pathRewrite: { "^/api/": "" }
  }
 }

在页面使用使用this.$axios做请求

到此这篇关于解决Nuxt使用axios跨域问题的文章就介绍到这了,更多相关Nuxt使用axios跨域内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript当中的代码嗅探扩展原生对象和原型(prototype)
Jan 11 Javascript
简洁Ajax函数处理(示例代码)
Nov 15 Javascript
js 处理数组重复元素示例代码
Dec 27 Javascript
js获取鼠标点击的位置实现思路及代码
May 09 Javascript
node.js中使用socket.io的方法
Dec 15 Javascript
基于jquery实现省市联动特效
Dec 17 Javascript
JS实现随机颜色的3种方法与颜色格式的转化
Jan 05 Javascript
微信小程序 出现47001 data format error原因解决办法
Mar 10 Javascript
关于angular js_$watch监控属性和对象详解
Apr 24 Javascript
详解小程序之简单登录注册表单验证
May 13 Javascript
uni-app 支持多端第三方地图定位的方法
Jan 03 Javascript
JavaScript实现网页动态生成表格
Nov 25 Javascript
js实现星星打分效果
Jul 05 #Javascript
jQuery实现简单飞机大战
Jul 05 #jQuery
javascript实现贪吃蛇小练习
Jul 05 #Javascript
jQuery实现简单日历效果
Jul 05 #jQuery
jQuery实现飞机大战小游戏
Jul 05 #jQuery
原生js实现随机点名
Jul 05 #Javascript
实例讲解JavaScript 计时事件
Jul 04 #Javascript
You might like
php中3种方法删除字符串中间的空格
2014/03/10 PHP
PHP微信模板消息操作示例
2017/06/29 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
JavaScript与DropDownList 区别分析
2010/01/01 Javascript
javascript Array对象基础知识小结
2010/11/16 Javascript
学习从实践开始之jQuery插件开发 对话框插件开发
2012/04/26 Javascript
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
jquery 删除字符串最后一个字符的方法解析
2014/02/11 Javascript
查找页面中所有类为test的结点的方法
2014/03/28 Javascript
jQuery中index()方法用法实例
2014/12/27 Javascript
JavaScript实现图像模糊化的方法实例
2017/01/15 Javascript
bootstrap table操作技巧分享
2017/02/15 Javascript
如何使用Bootstrap 按钮实例详解
2017/03/29 Javascript
JS中定位 position 的使用实例代码
2017/08/06 Javascript
浅谈Vuejs Prop基本用法
2017/08/17 Javascript
vue中接口域名配置为全局变量的实现方法
2018/09/20 Javascript
Vue.js 中的 v-cloak 指令及使用详解
2018/11/19 Javascript
编写简单的Python程序来判断文本的语种
2015/04/07 Python
Python实现计算最小编辑距离
2016/03/17 Python
Python使用tkinter模块实现推箱子游戏
2019/10/08 Python
django框架cookie和session用法实例详解
2019/12/10 Python
学习Python需要哪些工具
2020/09/04 Python
基于Python组装jmx并调用JMeter实现压力测试
2020/11/03 Python
英国最出名高街品牌:Forever Unique
2018/02/24 全球购物
巴西网上药店:Drogaria Araujo
2021/01/06 全球购物
心理健康心得体会
2014/01/02 职场文书
致铅球运动员广播稿精选
2014/01/12 职场文书
经贸韩语专业大学生职业规划
2014/02/14 职场文书
员工安全责任书范本
2014/07/24 职场文书
致百米运动员广播稿5篇
2014/10/13 职场文书
2015年酒店工作总结
2015/04/28 职场文书
超市主管竞聘书
2015/09/15 职场文书
2016高考冲刺决心书
2015/09/23 职场文书
跟班学习心得体会(共6篇)
2016/01/23 职场文书
PL350与SW11的比较
2021/04/22 无线电
入门学习Go的基本语法
2021/07/07 Golang