解决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动态调整iframe高度的代码
Apr 10 Javascript
jquery移动listbox的值原理及代码
May 03 Javascript
Jquery AJAX POST与GET之间的区别
Nov 14 Javascript
jquery实现仿Flash的横向滑动菜单效果代码
Sep 17 Javascript
JavaScript判断对象是否为数组
Dec 22 Javascript
jQuery on()绑定动态元素出现的问题小结
Feb 19 Javascript
AngularJs Injecting Services Into Controllers详解
Sep 02 Javascript
微信小程序 Storage API实例详解
Oct 02 Javascript
JavaScript SHA512加密算法详细代码
Oct 06 Javascript
JavaScript中的FileReader图片预览上传功能实现代码
Jul 24 Javascript
详解node登录接口之密码错误限制次数(含代码)
Oct 25 Javascript
element-ui 本地化使用教程详解
Oct 28 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实现验证码功能
2006/10/09 PHP
PHP学习之PHP表达式
2006/10/09 PHP
php 伪造HTTP_REFERER页面URL来源的三种方法
2016/09/22 PHP
javascript document.compatMode兼容性
2010/02/23 Javascript
基于jquery的15款幻灯片插件
2011/04/10 Javascript
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
window.open的页面如何刷新(父页面)上层页面
2012/12/28 Javascript
js nextSibling属性和previousSibling属性概述及使用注意
2013/02/16 Javascript
两个select多选模式的选项相互移动(示例代码)
2014/01/11 Javascript
详解javascript中的事件处理
2015/11/06 Javascript
javascript中return,return true,return false三者的用法及区别
2015/11/17 Javascript
BootStrap CSS全局样式和表格样式源码解析
2017/01/20 Javascript
jQuery元素选择器实例代码
2017/02/06 Javascript
详解vue2.0组件通信各种情况总结与实例分析
2017/03/22 Javascript
javascript 中null和undefined区分和比较
2017/04/19 Javascript
AngularJs 最新验证手机号码的实例,成功测试通过
2017/11/26 Javascript
webpack-dev-server自动更新页面方法
2018/02/22 Javascript
python实现在windows下操作word的方法
2015/04/28 Python
python写入xml文件的方法
2015/05/08 Python
Python基于whois模块简单识别网站域名及所有者的方法
2018/04/23 Python
基于Python开发chrome插件的方法分析
2018/07/07 Python
python基于json文件实现的gearman任务自动重启代码实例
2019/08/13 Python
python3获取文件中url内容并下载代码实例
2019/12/27 Python
详解pandas映射与数据转换
2021/01/22 Python
Flask中jinja2的继承实现方法及实例
2021/03/03 Python
怎样实现H5+CSS3手指滑动切换图片的示例代码
2019/05/05 HTML / CSS
合作协议书怎么写
2014/04/18 职场文书
电子银行业务授权委托书
2014/10/10 职场文书
2015年征兵工作总结
2015/07/23 职场文书
中秋节感想
2015/08/10 职场文书
2016年幼儿园教师师德承诺书
2016/03/25 职场文书
JavaScript 语句之常用 for 循环详解
2021/03/29 Javascript
Django项目如何获得SSL证书与配置HTTPS
2021/04/30 Python
使用Nginx搭载rtmp直播服务器的方法
2021/10/16 Servers
「偶像大师 MILLION LIVE!」七尾百合子手办开订
2022/03/21 日漫
《我的美好婚事》动画化决定纪念插画与先导PV公开
2022/04/06 日漫