解决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 相关文章推荐
jquery animate 动画效果使用说明
Nov 04 Javascript
两个比较有用的Javascript工具函数代码
Feb 17 Javascript
IE下window.onresize 多次调用与死循环bug处理方法介绍
Nov 12 Javascript
jquery序列化表单以及回调函数的使用示例
Jul 02 Javascript
jquery的总体架构分析及实现示例详解
Nov 08 Javascript
如何屏蔽防止别的网站嵌入框架代码
Aug 24 Javascript
基于hover的用法实例(推荐)
Jul 04 Javascript
关于vue面试题汇总
Mar 20 Javascript
vue2中使用sass并配置全局的sass样式变量的方法
Sep 04 Javascript
JS大坑之19位数的Number型精度丢失问题详解
Apr 22 Javascript
解决vue 使用setTimeout,离开当前路由setTimeout未销毁的问题
Jul 21 Javascript
js实现随机点名
Jan 19 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
利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
2013/11/26 PHP
php中convert_uuencode()与convert_uuencode函数用法实例
2014/11/22 PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
2016/10/11 PHP
HTA版JSMin(省略修饰语若干)基于javascript语言编写
2009/12/24 Javascript
stream.js 一个很小、完全独立的Javascript类库
2011/10/28 Javascript
JavaScript中for循环的使用详解
2015/06/03 Javascript
javascript实现图片上传前台页面
2015/08/18 Javascript
基于JavaScript实现通用tab选项卡(通用性强)
2016/01/07 Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
2016/04/05 Javascript
Bootstrap 模态框(Modal)带参数传值实例
2017/08/20 Javascript
微信小程序实现滚动消息通知
2018/02/02 Javascript
vue中使用codemirror的实例详解
2018/11/01 Javascript
解析JS在获取当前月的最后一天遇到的坑
2019/08/30 Javascript
Javascript文本框脚本实现方法解析
2020/10/30 Javascript
python传递参数方式小结
2015/04/17 Python
用Python脚本来删除指定容量以上的文件的教程
2015/05/04 Python
python黑魔法之参数传递
2016/02/12 Python
python验证码识别实例代码
2018/02/03 Python
Python装饰器原理与用法分析
2018/04/30 Python
Python装饰器模式定义与用法分析
2018/08/06 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
Python 最强编辑器详细使用指南(PyCharm )
2019/09/16 Python
Python celery原理及运行流程解析
2020/06/13 Python
Python调用shell cmd方法代码示例解析
2020/06/18 Python
意大利香水和彩妆护肤品购物网站:Ditano
2017/08/13 全球购物
俄罗斯电动工具和设备购物网站:Vseinstrumenti.ru
2020/11/12 全球购物
给客户的道歉信
2014/01/13 职场文书
感恩节红领巾广播稿
2014/02/11 职场文书
学习雷锋精神演讲稿
2014/05/10 职场文书
汽车机电维修工求职信
2014/09/30 职场文书
财务会计求职信范文
2015/03/20 职场文书
中秋节主题班会
2015/08/14 职场文书
2016年离婚协议书范文
2016/03/18 职场文书
详解vue中v-for的key唯一性
2021/05/15 Vue.js
一文搞懂python异常处理、模块与包
2021/06/26 Python
Vue深入理解插槽slot的使用
2022/08/05 Vue.js