解决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 相关文章推荐
贴一个在Mozilla中常用的Javascript代码
Jan 09 Javascript
js计算字符串长度包含的中文是utf8格式
Oct 15 Javascript
JS获得浏览器版本和操作系统版本的例子
May 13 Javascript
js跨域问题浅析及解决方法优缺点对比
Nov 08 Javascript
JavaScript实现俄罗斯方块游戏过程分析及源码分享
Mar 23 Javascript
JS实现将数字金额转换为大写人民币汉字的方法
Aug 02 Javascript
javascript基础练习之翻转字符串与回文
Feb 20 Javascript
js中的DOM模拟购物车功能
Mar 22 Javascript
JS获取数组中出现次数最多及第二多元素的方法
Oct 27 Javascript
vue.js $refs和$emit 父子组件交互的方法
Dec 20 Javascript
AngularJS创建一个上传照片的指令实例代码
Feb 24 Javascript
修改Vue打包后的默认文件名操作
Aug 12 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
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
2012/03/27 PHP
PHP实现从PostgreSQL数据库检索数据分页显示及根据条件查找数据示例
2018/06/09 PHP
33个优秀的 jQuery 图片展示插件分享
2012/03/14 Javascript
表单的焦点顺序tabindex和对应enter键提交
2013/01/04 Javascript
表单类各种类型(文本框)失去焦点效果jquery代码
2013/04/26 Javascript
javascript内置对象arguments详解
2014/03/16 Javascript
JavaScript实现上下浮动的窗口效果代码
2015/10/12 Javascript
javascript日期验证之输入日期大于等于当前日期
2015/12/13 Javascript
兼容浏览器的js事件绑定函数(详解)
2017/05/09 Javascript
Javascript中将变量转换为字符串的三种方法
2017/09/19 Javascript
layui之select的option叠加问题的解决方法
2018/03/08 Javascript
vue代理和跨域问题的解决
2018/07/18 Javascript
详解Vue中数组和对象更改后视图不刷新的问题
2018/09/21 Javascript
JavaScript 装逼指南(js另类写法)
2020/05/10 Javascript
Element InputNumber计数器的使用方法
2020/07/27 Javascript
Python笔记(叁)继续学习
2012/10/24 Python
python中类的一些方法分析
2014/09/25 Python
python3序列化与反序列化用法实例
2015/05/26 Python
Python的Django框架中设置日期和字段可选的方法
2015/07/17 Python
使用Pyinstaller的最新踩坑实战记录
2017/11/08 Python
Python实现k-means算法
2018/02/23 Python
tensorflow更改变量的值实例
2018/07/30 Python
Python3模拟登录操作实例分析
2019/03/12 Python
Python-接口开发入门解析
2019/08/01 Python
Python利用myqr库创建自己的二维码
2020/11/24 Python
canvas之万花筒效果的简单实现(推荐)
2016/08/16 HTML / CSS
CSS3利用text-shadow属性实现多种效果的文字样式展现方法
2016/08/25 HTML / CSS
物流管理专业求职信
2014/05/29 职场文书
比赛口号大全
2014/06/10 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
公司离职证明范本(汇总)
2014/09/10 职场文书
乡党政领导班子群众路线教育实践活动个人对照检查材料
2014/09/20 职场文书
查摆问题整改措施范文
2014/10/11 职场文书
2015年公路养护工作总结
2015/05/13 职场文书
市语委办2016年第十九届“推普周”活动总结
2016/04/05 职场文书
PyMongo 查询数据的实现
2021/06/28 Python