解决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 客户端验证上传图片的大小(兼容IE和火狐)
Aug 15 Javascript
js 父窗口控制子窗口的行为-打开,关闭,重定位,回复
Apr 20 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
Feb 26 Javascript
select标记美化--JS式插件、后期加载
Apr 01 Javascript
关于jQuery中.attr()和.prop()的问题探讨
Sep 06 Javascript
javascript中match函数的用法小结
Feb 08 Javascript
JS实现动态表格的添加,修改,删除功能(推荐)
Jun 15 Javascript
JQuery实现table中tr上移下移的示例(超简单)
Jan 08 jQuery
小程序实现选择题选择效果
Nov 04 Javascript
layui实现form表单同时提交数据和文件的代码
Oct 25 Javascript
vue实现数字动态翻牌的效果(开箱即用)
Dec 08 Javascript
浅谈Vue static 静态资源路径 和 style问题
Nov 07 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结合表单实现一些简单功能的例子
2011/06/04 PHP
PHP中使用GD库创建圆形饼图的例子
2014/11/19 PHP
PHP中$_SERVER使用说明
2015/07/05 PHP
php实现JWT(json web token)鉴权实例详解
2019/11/05 PHP
srcElement表格样式
2006/09/03 Javascript
javascript中match函数的用法小结
2014/02/08 Javascript
Thinkphp模板没有解析直接原样输出的解决方法
2014/10/31 Javascript
Node.js的npm包管理器基础使用教程
2016/05/26 Javascript
jquery动态遍历Json对象的属性和值的方法
2016/07/27 Javascript
AngularJs  Creating Services详解及示例代码
2016/09/02 Javascript
JQuery手速测试小游戏实现思路详解
2016/09/20 Javascript
Move.js入门
2017/02/08 Javascript
Angular动态添加、删除输入框并计算值实例代码
2017/03/29 Javascript
jquery实现商品sku多属性选择功能(商品详情页)
2019/12/20 jQuery
javascript设计模式 ? 备忘录模式原理与用法实例分析
2020/04/21 Javascript
[01:14]2019完美世界城市挑战赛(秋季赛)全国总决赛精彩花絮
2020/01/08 DOTA
详解Python中的__new__()方法的使用
2015/04/09 Python
Python基于pygame实现的弹力球效果(附源码)
2015/11/11 Python
Python第三方库的安装方法总结
2016/06/06 Python
详解Python发送email的三种方式
2018/10/18 Python
使用python实现mqtt的发布和订阅
2019/05/05 Python
Python实现获取系统临时目录及临时文件的方法示例
2019/06/26 Python
Python实现把类当做字典来访问
2019/12/16 Python
幼儿园实习自我鉴定
2013/12/15 职场文书
学生自我鉴定模板
2013/12/30 职场文书
关于毕业的中学校园广播稿
2014/01/26 职场文书
个人股份转让协议书范本
2015/01/28 职场文书
处罚决定书范文
2015/06/24 职场文书
小学班级标语口号大全
2015/12/26 职场文书
职场新人刚入职工作总结该怎么写?
2019/05/15 职场文书
预备党员入党思想汇报(范文)
2019/08/14 职场文书
React列表栏及购物车组件使用详解
2021/06/28 Javascript
Python 中的 copy()和deepcopy()
2021/11/07 Python
Nginx动静分离配置实现与说明
2022/04/07 Servers
详解Android中的TimePickerView(时间选择器)的用法
2022/04/30 Java/Android
Mysql 一主多从的部署
2022/05/20 MySQL