解决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 放大镜 移动镜片效果代码
May 09 Javascript
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
Apr 17 Javascript
将文本输入框内容加入表中的js代码
Aug 18 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
Sep 25 Javascript
js加载读取内容及显示与隐藏div示例
Feb 13 Javascript
js弹出确认是否删除对话框
Mar 27 Javascript
探讨JavaScript标签位置的存放与功能有无关系
Jan 15 Javascript
详解js产生对象的3种基本方式(工厂模式,构造函数模式,原型模式)
Jan 09 Javascript
解决Vue2.x父组件与子组件之间的双向绑定问题
Mar 06 Javascript
node使用promise替代回调函数
May 07 Javascript
解析vue、angular深度作用选择器
Sep 11 Javascript
使用webpack5从0到1搭建一个react项目的实现步骤
Dec 16 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转义输出HTML到JavaScript
2015/03/27 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
javascript下4个跨浏览器必备的函数
2010/03/07 Javascript
js Map List 遍历使用示例
2013/07/10 Javascript
jquery改变tr背景色的示例代码
2013/12/28 Javascript
网页中表单按回车就自动提交的问题的解决方案
2014/11/03 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
一个用jquery写的判断div滚动条到底部的方法【推荐】
2016/04/29 Javascript
探究Vue.js 2.0新增的虚拟DOM
2016/10/20 Javascript
解析Vue2 dist 目录下各个文件的区别
2017/11/22 Javascript
Node.js中sequelize时区的配置方法
2017/12/10 Javascript
vue获取当前激活路由的方法
2018/03/17 Javascript
深入理解Vue keep-alive及实践总结
2019/08/21 Javascript
Vue 实现复制功能,不需要任何结构内容直接复制方式
2019/11/09 Javascript
vue 实现根据data中的属性值来设置不同的样式
2020/08/04 Javascript
python使用rsa加密算法模块模拟新浪微博登录
2014/01/22 Python
浅谈python中的__init__、__new__和__call__方法
2017/07/18 Python
关于Python数据结构中字典的心得
2017/12/04 Python
使用C++扩展Python的功能详解
2018/01/12 Python
使用django的objects.filter()方法匹配多个关键字的方法
2019/07/18 Python
Python udp网络程序实现发送、接收数据功能示例
2019/12/09 Python
Python matplotlib绘制图形实例(包括点,曲线,注释和箭头)
2020/04/17 Python
Python中的xlrd模块使用原理解析
2020/05/21 Python
python如何安装下载后的模块
2020/07/03 Python
python3中calendar返回某一时间点实例讲解
2020/11/18 Python
Lookfantastic美国/加拿大:英国知名美妆购物网站
2019/03/27 全球购物
物流仓储实习自我鉴定
2013/09/25 职场文书
毕业生的自我鉴定该怎么写
2013/12/02 职场文书
制药工程专业毕业生推荐信
2013/12/24 职场文书
数控技术应用个人求职信范文
2014/02/03 职场文书
工商企业管理专业自荐信范文
2014/04/12 职场文书
2014年十一国庆节爱国演讲稿
2014/09/23 职场文书
护士2014年终工作总结
2014/11/11 职场文书
党员转正申请报告
2015/05/15 职场文书
办公用品管理制度
2015/08/04 职场文书
MYSQL事务的隔离级别与MVCC
2022/05/25 MySQL