当前位置: 首页 > news >正文

前端axios封装request请求,在request(编译时)里面使用windows报错

1.报错代码

可以看到const isLocalEnv = !location.href.includes(".com"); 是直接定义在文件中的,然后request里面引入globalConfig,handle401AndRedirect(toLogout);是在报错时执行的

src\utils\globalConfig.ts

const isLocalEnv = !location.href.includes(".com");/*** @description 本地运行时,登录失效是否重定向到登录* @param callback 重定向函数* @version: 2024-08-30 11:39:11*/
const isRedirectOn401InLocal = false;
export const handle401AndRedirect = (callback) => {if (isLocalEnv && isRedirectOn401InLocal) {callback();}
};

src\utils\request.ts

import { handle401AndRedirect } from "./globalConfig";
export const requestDefaultConfig: ICERequestConfig = {baseURL: env.systemService.baseUrl,timeout: 60000,// 拦截器sinterceptors: {request:{},response: {onConfig: (response) => {return response;},onError: (error) => {handle401AndRedirect(toLogout);}}}
}

2.修改后的代码

可以看到const isLocalEnv = !location.href.includes(".com"); 改成在函数中定义了,然后request里面引入globalConfig,handle401AndRedirect(toLogout);是在报错时执行的,也就是报错时才定义window相关的属性

src\utils\globalConfig.ts


/*** @description 本地运行时,登录失效是否重定向到登录* @param callback 重定向函数* @version: 2024-08-30 11:39:11*/
const isRedirectOn401InLocal = false;
export const handle401AndRedirect = (callback) => {const isLocalEnv = !location.href.includes(".com");if (isLocalEnv && isRedirectOn401InLocal) {callback();}
};

src\utils\request.ts

import { handle401AndRedirect } from "./globalConfig";
export const requestDefaultConfig: ICERequestConfig = {baseURL: env.systemService.baseUrl,timeout: 60000,// 拦截器sinterceptors: {request:{},response: {onConfig: (response) => {return response;},onError: (error) => {handle401AndRedirect(toLogout);}}}
}

3.分析

在JavaScript中,模块顶层代码导入模块时会立即执行request里面一引入globalConfig就会执行window相关的代码,但是request一开始是在编译时执行的,而编辑时不存在window相关属性,如果这些代码依赖于特定环境(如浏览器环境)的全局对象(如 location),而在导入时该环境并不可用,那么这些代码就会抛出错误。

在上面的代码中,在模块顶层的代码中使用了 location 对象,这导致了在非浏览器环境下导入该模块时出现错误。为了解决这个问题,可以将依赖于浏览器环境的代码移动到一个函数中。函数的内容只有在调用时才会被执行,因此可以确保当你的函数在浏览器环境中被调用时,location 对象是可用的。

const isLocalEnv = !location.href.includes(".com") 的定义移动到了 handle401AndRedirect 函数中。这样,只有在浏览器环境中调用 handle401AndRedirect 函数时,才会尝试访问 location 对象,从而避免了在非浏览器环境中导入模块时出现错误。

这是一种被称为"延迟执行"的策略,它可以确保只有在正确的环境中,才会执行依赖于该环境的代码。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 8 大模型微调
  • 数学建模学习(124):使用Python实现模糊ARAS方法从原理到实战
  • 如何在知行之桥上通过业务单号查找原始报文?
  • 【推荐】多模态基础大模型技术白皮书|附下载
  • 衡石产品手册--数据集如何配置对接和开发
  • 限流策略探讨
  • 关于springboot的Rest请求映射处理的源码分析(二)
  • Furion+SqlSugar+Swagger企业级后端工程师 - 学习路线总目录
  • 爬虫入门学习
  • 基于imx6ull平台opencv的图像采集、ffmpeg推流和Windows端拉流(多线程)
  • easyExcel 导入时,校验每个单元格数据
  • 如何快速判断Excel中选区跨页?
  • 笔记:应用Visual Studio Profiler识别和解决内存泄漏问题
  • UE4 BuildCookRun中的Archive的含义
  • 彩色相机拍照,图片时亮时暗
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 2019年如何成为全栈工程师?
  • Angularjs之国际化
  • Docker容器管理
  • github从入门到放弃(1)
  • httpie使用详解
  • in typeof instanceof ===这些运算符有什么作用
  • java2019面试题北京
  • Linux后台研发超实用命令总结
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • Vue全家桶实现一个Web App
  • vue中实现单选
  • 爱情 北京女病人
  • 回流、重绘及其优化
  • 面试遇到的一些题
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 我与Jetbrains的这些年
  • 一文看透浏览器架构
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 云大使推广中的常见热门问题
  • # wps必须要登录激活才能使用吗?
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • $nextTick的使用场景介绍
  • (02)Unity使用在线AI大模型(调用Python)
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (十三)MipMap
  • (一)Neo4j下载安装以及初次使用
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)平衡树
  • (状压dp)uva 10817 Headmaster's Headache
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .bat批处理(五):遍历指定目录下资源文件并更新