vue3+Ts 关于生成环境与开发环境请求路径问题

这里我是创建了axios 实例,通过axios 实例去请求后端,

// 创建axios实例
export const service:AxiosInstance = axios.create({//请求地址baseURL: (window as any).Config.BACKEND_URL, //import.meta.env.VITE_APP_BASE_API, // 超时timeout: 10000 * 20,//请求头headers: {'Content-Type': 'application/json;charset=utf-8',},
});

baseURL是请求地址,调用axios /test 请求时,请求后端地址:请求地址/test
(window as any).Config.BACKEND_URL 外部配置文件,好处是当我们打包后,不用nginx
配置前端项目。可以直接用IIS(Internet Information Server)部署,然后请求后端地址就是(window as any).Config.BACKEND_URL配置里面的
import.meta.env.VITE_APP_BASE_API 是vue内部的生产环境和开发环境,根据环境不同,配置响应的拦截,请求后端

外部配置文件
public–static 创建config.js(项目打包后,会存在disr/static/文件夹下面)

window.Config = {// 后台urlBACKEND_URL: 'http://192.168.xx.xx:xx/',}

在项目的index.html 映入

<script src="/static/config.js"></script>

这样封装axios请求时就可以,使用外部配置文件,配置后端请求地址

开发环境

.env.development 文件

# 页面标题
VITE_APP_TITLE = 首页
# 开发环境配置
VITE_APP_ENV = 'development'
# 微信公众号/开发环境
VITE_APP_BASE_API = '/dev-api'

request.ts

import axios, { AxiosInstance, AxiosResponse }from "axios";
import { showNotify } from 'vant';
//引入store
import userStore from '@/store/userStore.ts'
const user = userStore();// 创建axios实例
export const service:AxiosInstance = axios.create({//请求地址baseURL:  import.meta.env.VITE_APP_BASE_API,  //window.Config.BACKEND_URL// 超时timeout: 10000 * 20,//请求头headers: {'Content-Type': 'application/json;charset=utf-8',},
});
// request拦截器,请求体加上token
service.interceptors.request.use((config: any) => {// prettier-ignoreconfig.headers["Authorization"] = "Bearer" + user.token; // 让每个请求携带自定义token 请根据实际情况自行修改return config;},(error) => {Promise.reject(error);}
);//响应拦截
service.interceptors.response.use((res:AxiosResponse) => {// 未设置状态码则默认成功状态const code = res.data.code;// 获取错误信息// prettier-ignoreconst msg = res.data.msg;// 二进制数据则直接返回// prettier-ignoreif (res.request.responseType === "blob" || res.request.responseType === "arraybuffer") {return res.data;};//返回状态码判断if (code === 401) {// 说明不通过微信公众号调用showNotify({ type: 'danger', message: '请关注微信公众号使用!',position: 'bottom', });// prettier-ignorereturn Promise.reject("请关注微信公众号!");} else if (code === 500) {showNotify({ type: 'danger', message: msg,position: 'bottom',});return Promise.reject(new Error(msg));} else if(code === 404) {return res.data;} else if(code === 201) { //没有数据return res.data;}else if(code !== 200){showNotify({ type: 'danger', message: msg,position: 'bottom', });return Promise.reject(new Error(msg));}else{return res.data;}
},  (error) => {let { message } = error;if (message == "Network Error") {message = "后端接口连接异常";showNotify({ type: 'danger', message: message ,position: 'bottom',});} else if (message.includes("timeout")) {message = "系统接口请求超时";showNotify({ type: 'danger', message: message ,position: 'bottom',});} else if (message.includes("Request failed with status code")) {message = "系统接口" + message.substr(message.length - 3) + "异常";showNotify({ type: 'danger', message: message ,position: 'bottom',});}return Promise.reject(error);});//对外暴露
export default service;

最重要是:baseURL: import.meta.env.VITE_APP_BASE_API,
在vue.config.ts中配置启动端口,假设8000,当你定义request请求

export const test =  async (cardId:string) => {return await request({url: '/test',method: 'get',})
}

你的请求并不是 ip地址:8000/test,而是 ip地址:8000/dev-api/test
另外假设我们在后端的求情地址是5002端口,需要访问后端/test路径,则需要配置代理
vue.config.ts

server: {host: "0.0.0.0", // 默认为localhostport: 5001, // 端口号open: false, // 是否自动打开浏览器// proxy:{}proxy: {// 本地开发环境通过代理实现跨域,生产环境使用 nginx 转发"/dev-api": {target: "http://localhost:5002", // 后端服务实际地址changeOrigin: true,//rewrite: (path) => path.replace(/^\/dev-api/, ""),rewrite: path => path.replace(new RegExp('^' + env.VITE_APP_BASE_API), '')},},},

意思是前端请求ip地址:8000/dev-api/test,会被代理拦截/dev-api/,去转发请求ip地址:5002/test,但是前端请求路径不会发生变化,任然是ip地址:8000/dev-api/test

生产环境

.env.production文件

# 页面标题
VITE_APP_TITLE = 首页# 生产环境配置
VITE_APP_ENV = 'production'# 微信公众号/生产环境
VITE_APP_BASE_API = '/prod-api'# 是否在打包时开启压缩,支持 gzip 和 brotli
VITE_BUILD_COMPRESS = gzip

request封装类不变,当打包成dist文件夹,需要放荡nginx上,此时你的请求路径不是
不是nginx启动地址端口/test,也不是nginx启动地址端口/dev-api/test,而是
nginx启动地址端口/prod-api/test,那如何访问后端/test地址呢,我们需要配置nginx 代理拦截/prod-api,转发到我们后端
的IP地址端口
nginx.config

#分布式项目中,前端调用后端配置location /prod-api/ {proxy_set_header Host $http_host;proxy_set_header X-Real-IP &remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header REMOTE_HOST $remote_addr;proxy_pass http://127.0.0.1:8080/;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/839810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3DMax文件打开跳出请求操作需要提升

解决方法如下 打开autoremove&#xff0c;点击扩展功能&#xff0c;点击管理员已经阻止运行此应用 提示修复成功后&#xff0c;重启电脑再尝试打开max文件。

保研笔试复习——nju

文章目录 一、单选计算机网络计算机组成原理数字逻辑电路数据结构操作系统微机系统 多选题计算机网络计算机系统结构操作系统 免责声明&#xff1a;题目源自于网络&#xff0c;侵删。 就在今天2024-5-18&#xff0c;考的题下面的只有一道AVL的原题&#xff0c;其他都不是原题&a…

平板如何实现无纸化会议

为了实现高效的无纸化会议&#xff0c;连通宝可以是在内部网络部署&#xff0c;那么&#xff0c;平板如何实现无纸化会议&#xff1f; 1. 服务器配置&#xff1a; 部署专用无纸化会议系统服务器&#xff08;如rhub无纸化会议服务器&#xff09;至组织的内部网络中。确保该服务…

Ipad air6买什么电容笔?5款超值精品平替电容笔推荐!

电容笔作为ipad的最佳拍档&#xff0c;为学生党和打工人带来了极大的便利&#xff0c;二者搭配效率真的大大提升&#xff0c;但是&#xff0c;如何选购一支适合自己的电容笔呢&#xff1f;作为一个对数码设备非常感兴趣并且有一定了解的人&#xff0c;我根据自己多年的使用经验…

SQLite数据库免改造透明加密解决方案:给数据加把锁

在数字化时代&#xff0c;信息安全和隐私保护显得尤为重要。TDE透明加密技术&#xff0c;是一种在用户无感知的情况下对数据进行加密和解密的技术。它能够在数据生成、存储、传输和使用过程中自动进行加密处理&#xff0c;无需用户手动操作。透明加密技术的核心在于其透明性&am…

webgl three 模型、几何体、材质关系 及克隆、拷贝

使用相同几何体、材质的模型相互等价 console.log(material1);console.log(mesh.material)console.log(mesh1.material) 当一个改变时另外两个也都改变 几何体也一样 重复模型、几何体、材质可以多次使用 更改坐标放在不同位置 网格模型Mesh、几何体、材质复制使用克隆.clon…

Wireshark 4.2.5:发现 QUIC 和 VXLAN 协议的新功能

Wireshark 是一种先进且广泛使用的网络协议分析仪&#xff0c;最近发布了新版本 4.2.5&#xff0c;它提供了许多新功能和改进。 Wireshark 4.2.5 发行说明 什么是 Wireshark&#xff1f; Wireshark 是世界上最流行的网络协议分析器。它用于故障排除、分析、开发和教育。 Wiresh…

服务器监控运维方案,一体化智能观测服务器状态

随着信息技术发展&#xff0c;服务器已经成为支撑各类应用系统的核心基础设施。业务数量的日益增长和稳定运行的高要求&#xff0c;也给服务器的稳定性与可靠性建立了更高的标准。然而&#xff0c;传统的服务器管理方式往往难以发现潜在问题&#xff0c;导致故障预警与处置的滞…

未来十年,电子测试仪器市场能跑赢电子产业吗

测试测量行业是整个电子信息技术产业发展的基石&#xff0c;作为从前沿探索到后期大规模生产都不可或缺的环节&#xff0c;引领着整个信息行业的创新方向。不过随着软件价值在测试产业的比值越来越高&#xff0c;以及验证和仿真等工具作用日渐强大&#xff0c;测试测量设备的市…

24.马尔科夫矩阵,傅里叶级数

文章目录 1. Markov matrix1.1 定义1.2 计算 2. 马尔科夫矩阵的应用3. 傅里叶级数3.1 标准正交基的投影问题3.2 函数正交3.3 傅里叶级数 1. Markov matrix 1.1 定义 对于马尔科夫矩阵Markov matrix 来说&#xff0c;矩阵A要满足两个条件&#xff1a; 矩阵A的每个元素必须大于…

【全开源】填表统计预约打卡表单系统FastAdmin+ThinkPHP+UniApp

简化流程&#xff0c;提升效率 一、引言&#xff1a;传统表单处理的局限性 在日常工作和生活中&#xff0c;我们经常会遇到需要填写表单、统计数据和预约打卡等场景。然而&#xff0c;传统的处理方式往往效率低下、易出错&#xff0c;且不利于数据的统计和分析。为了解决这些…

Django提交表单出错提示错误

使用ArticleColumnForm表单&#xff0c;向数据库提交内容&#xff0c;内容包括column。如果同一用户提交的column重复&#xff0c;则提示表单出错&#xff0c;表单提交失败后&#xff0c;重新渲染表单提交html页面&#xff0c;其中提示错误信息。 涉及的代码包括&#xff1a; …

语义化版本规范

Releases 是指软件或项目的正式发布版本&#xff0c;在浏览一些开源仓库时&#xff0c;可以看到当前项目最新版本和历史版本 仔细研究就会发现&#xff0c;版本号不是以固定值递增的&#xff0c;有时候第三位加 1&#xff0c;有时候加 2&#xff0c;有时候直接把第一位加 1&…

「动态规划」按摩师

力扣原题链接&#xff0c;点击跳转。 一个有名的按摩师会收到源源不断的预约请求&#xff0c;每个预约都可以选择接或不接。在每次预约服务之间要有休息时间&#xff0c;因此她不能接受相邻的预约。给定一个预约请求序列nums&#xff0c;总共有n个预约&#xff0c;替按摩师找到…

(delphi11最新学习资料) Object Pascal 学习笔记---第12章第3节(类引用)

12.3 类引用 ​ 在了解了与方法相关的几个主题后&#xff0c;我们现在可以转向类引用的主题&#xff0c;并进一步扩展我们动态创建组件的示例。首先要记住的一点是&#xff0c;类引用不是一个类&#xff0c;不是一个对象&#xff0c;也不是一个对象引用&#xff1b;它只是对类…

【Redis】String的介绍与应用详解

大家好&#xff0c;我是白晨&#xff0c;一个不是很能熬夜&#xff0c;但是也想日更的人。如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下&#x1f440;白晨吧&#xff01;你的支持就是我最大的动力&#xff01;&#x1f4aa;&#x1f4aa;&#x1f4aa…

消息队列RabbitMQ最佳实践总结

消息队列RabbitMQ的最佳实践总结如下&#xff1a; 合理设计队列和交换机&#xff1a; 根据业务需求&#xff0c;选择合适的交换机类型&#xff08;如直连交换机、主题交换机、扇出交换机等&#xff09;&#xff0c;并定义清晰的路由规则。避免创建过多的队列和交换机&#xff…

操作系统总结(2)

目录 2.1 进程的概念、组成、特征 &#xff08;1&#xff09;知识总览 &#xff08;2&#xff09;进程的概念 &#xff08;3&#xff09;进程的组成—PCB &#xff08;4&#xff09;进程的组成---程序段和数据段 &#xff08;5&#xff09;程序是如何运行的呢&#xff1f…

《中国企业报》集团数字产业发展研究院介绍

《中国企业报》集团数字产业发展研究院&#xff08;以下简称“中企数研院”&#xff09;&#xff0c;隶属于《中国企业报》集团管理。“中企数研院”致力于“数字经济产业化发展战略”大背景下&#xff0c;以“县域数字经济”、“企业数字化转型”及“数字人民币”推广等发展方…