解决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代码的实现一个图片向上滚动切换
Sep 02 Javascript
ExtJS4给Combobox设置列表中的默认值示例
May 02 Javascript
js实现类似jquery里animate动画效果的方法
Apr 10 Javascript
JS实现横向拉伸动感伸缩菜单效果代码
Sep 04 Javascript
详解javascript函数的参数
Nov 10 Javascript
jquery mobile 移动web(5)
Dec 20 Javascript
JavaScript中this的用法实例分析
Dec 19 Javascript
vue.js实现备忘录功能的方法
Jul 10 Javascript
weex slider实现滑动底部导航功能
Aug 28 Javascript
微信小程序人脸识别功能代码实例
May 07 Javascript
微信小程序bindtap事件与冒泡阻止详解
Aug 08 Javascript
AJAX引擎原理以及XmlHttpRequest对象的axios、fetch区别详解
Apr 09 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
ThinkPHP视图查询详解
2014/06/30 PHP
php生成验证码,缩略图及水印图的类分享
2016/04/07 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
JQuery 表单中textarea字数限制实现代码
2009/12/07 Javascript
javascript处理table表格的代码
2010/12/06 Javascript
JavaScript程序员应该知道的45个实用技巧
2014/03/04 Javascript
深入解析JavaScript的闭包机制
2015/10/20 Javascript
基于RequireJS和JQuery的模块化编程——常见问题全面解析
2016/04/14 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
2016/05/24 Javascript
EasyUI学习之Combobox级联下拉列表(2)
2016/12/29 Javascript
jQuery获取Table某列的值(推荐)
2017/03/03 Javascript
JS全角与半角转化实例(分享)
2017/07/04 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
vue自定义filters过滤器
2018/04/26 Javascript
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
[03:41]DOTA2上海特锦赛小组赛第三日recap精彩回顾
2016/02/28 DOTA
[26:50]2018完美盛典DOTA2表演赛
2018/12/17 DOTA
基于Python中capitalize()与title()的区别详解
2017/12/09 Python
flask-restful使用总结
2018/12/04 Python
Python日志无延迟实时写入的示例
2019/07/11 Python
Python如何筛选序列中的元素的方法实现
2019/07/15 Python
python文档字符串(函数使用说明)使用详解
2019/07/30 Python
如何使用Python多线程测试并发漏洞
2019/12/18 Python
python开发一个解析protobuf文件的简单编译器
2020/11/17 Python
HTML5之SVG 2D入门5—颜色的表示及定义方式
2013/01/30 HTML / CSS
美国彩妆品牌:Coastal Scents
2017/04/01 全球购物
意大利值得信赖的在线超级药房:PillolaStore
2020/02/05 全球购物
金融专业毕业生推荐信
2013/11/26 职场文书
旷课检讨书大全
2014/01/21 职场文书
广告创意求职信
2014/03/17 职场文书
钱塘江大潮导游词
2015/02/03 职场文书
英语辞职信怎么写
2015/02/28 职场文书
感动中国何玥观后感
2015/06/02 职场文书
2015年主婚人婚礼致辞
2015/07/28 职场文书
2016年公司中秋节致辞
2015/11/26 职场文书
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
2022/08/14 MySQL