【Bug排查】Uncaught (in promise) Error: Infinite redirect in navigation guard
记一次Bug排查
今日在做尚硅谷的商品甄选项目时,遇到无法登录的问题:报错Uncaught (in promise) Error: Infinite redirect in navigation guard
一开始我去搜CSDN,都说是路由的问题,我对前端也不了解,试着改了一下,发现没有用。我怀疑是前端包的问题,于是我重新下载解压了若干次资料中的前端包 —— 最原始的模板,下载完依赖的模板,甚至所有前端代码都写完的代码,都还是那个问题。
前端模板刚拿过来时好用的,但在进行了一系列修改后,就出现登录界面一直转圈进不去报错的问题了。我从头开始,重复每一步的修改,然后去看界面有没有问题。
我注意到,当我修改完后端接口,并把api路径修改为自己的路径后,就出现错误了。这时,我才想起来打开F12查看Network,发现getUserinfo这个接口被调了10多次,我发现问题不对了,明明只点击了一次登录,为什么会调这么多次。
我去前端代码里搜寻getUserinfo这个接口的调用,发现有这样一段代码:
if (!userinfo) {try {// 获取用户信息await getUserinfo()} catch (err) {loadingInstance.close()return false}return to.fullPath
}
这段代码当userinfo为空时,就会一直调用getUserinfo()这个方法,难道我获取userinfo都是空吗?于是在控制台打印userinfo,竟然真的是清一色的null!
看来是后端出了问题,我再到后端去看,后端有一个controller返回的用户信息是SysUser类
@GetMapping("/getUserInfo")public Result<SysUser> getUserInfo(@RequestHeader(name = "token") String token) {// 1.从请求头获取token// 2.根据token从redis查询用户信息SysUser sysUser = sysUserService.getUserInfo(token);// 3.返回用户信息return Result.ok(sysUser);}
于是我进行sysUser的打印,果然也为空,我继续追溯到sysUserService服务中的getUserInfo()方法,这个方法是根据token从redis中查询到存储的用户信息。
public SysUser getUserInfo(String token) {//redis取数据String userJson = redisTemplate.opsForValue().get(RedisKeyEnum.USER_LOGIN + token);System.out.println("userJson:"+userJson);return JSON.parseObject(userJson, SysUser.class);}
乍一看我还没发现这个get()方法有啥问题,但当我与上面写的redis的set()方法作对比时,恍然大悟:
// redis存数据
redisTemplate.opsForValue().set(RedisKeyEnum.USER_LOGIN.getValue() + token,JSON.toJSONString(sysUser),7, TimeUnit.DAYS);
发现没?key不一样!
在set的时候是RedisKeyEnum.USER_LOGIN.getValue(),而在get的时候就忘了加getValue()了,结果当然不对,自然就查不到对应的用户信息,前端自然会出问题了。
到头来还是个低级错误啊。。。
所以在自己做项目时,界面上出现了问题,第一反应是看后端请求有没有问题,而不是抓着前端不放,后台管理项目的前端大部分都是既定模板,只要修改正确,不会出啥问题,往往后端的一些小纰漏才是问题的根源。
相关文章:
【Bug排查】Uncaught (in promise) Error: Infinite redirect in navigation guard
记一次Bug排查 今日在做尚硅谷的商品甄选项目时,遇到无法登录的问题:报错Uncaught (in promise) Error: Infinite redirect in navigation guard 一开始我去搜CSDN,都说是路由的问题,我对前端也不了解,试着改了一下&…...
ant使用第三方任务
ant提供了一个插件机制来使用第三方的任务。为了使用第三方的任务,需要做两步: 将它们的实现放在ant能找到的地方。声明任务 声明任务的几种方法: 声明一个任务:利用<taskdef name"taskname" classname"Impl…...
MySQL 性能分析
MySQL 性能分析 对 mysql 进行性能分析,主要就是提升查询的效率,其中索引占主导地位。对 mysql 进行性能分析主要有如下几种方式: 方式一:查看 sql 执行频次 show global status like ‘Com_______’; // global 表示全局 show s…...
【MySQL】数据库——库操作
文章目录 1. 创建数据库[IF NOT EXISTS] 的使用 2. 删除库3. 数据库的编码问题查看系统默认支持的字符集查看系统默认支持的校验集只查看 database的校验集指定编码创建数据库修改字符集修改校验集验证规则对数据库的影响utf8_general_ci ——不区分大小写utf8_bin ——区分大小…...
Python 轻量 ORM peewee 上手
介绍 有时候需要用 Python 直接操作数据库, 手工撸 SQL 倒也不是不能行, 但是总觉得有点背离了 人生苦短, 我用 Python 的初心, 习惯了 SQLAlchemy 的直接操作后, 就变懒了. 但是对于比较简单的数据库操作场景, 再跑一套 SQLAlchemy 又显得有些臃肿, 这次上手轻量 Python ORM …...
微信小程序开发的OA会议之会议,投票,个人中心的页面搭建及模板
目录 一.自定义组件 1.1.创建 1.2.定义 1.3.编写 1.4.使用 二.会议 2.1.数据 2.2.显示 2.3. 样式 三.个人中心 3.1.页面 3.2.样式 四.投票 4.1.引用 4.2.数据 4.3.页面 4.4.样式 好啦今天就到这里了,希望能帮到你哦!!&…...
决策树-入门
1、认识决策树 决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-then结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法 怎么理解这句话?通过一个对话例子 想一想这个女生为什么把年龄放在最上面判断!&a…...
使用Redis发布订阅模式实现 Session共享
其实并不是实现session共享,而是通过redis的发布订阅,让所有集群的服务器,都让自己的session发送一下消息。比如说userId在第35台服务器上, 有100台服务器,那么第1台服务器收到消息,需要通知userId…...
安达发|AI在APS生产计划排程系统中的应用与优势
随着科技的不断发展,人工智能(AI)已经在许多领域取得了显著的成果。在生产管理计划系统中,AI技术的应用也日益受到关注。本文将探讨如何将AI人工智能用在生产管理计划系统上,以提高生产效率、降低成本并优化资源配置。…...
国产低功耗MCU芯片:Si24R03
Si24R03集成了基于RISC-V核的低功耗MCU和工作在2.4GHz ISM频段的无线收发器模块,是一款高度集成的低功耗SOC片。 应用领域: 1、物联网 2、智N门锁 3、电机控制 4、消费电子 5、工业控制 其无线收发器模块是专为低功耗无线场合设计,在关…...
【Java】学生管理系统项目演示
目录 学生管理系统 学生管理系统代码思路分析 nextLine() 和 nextInt() 区别 学生管理系统 需求:实现对学生的增删改查功能,学生(学号,姓名,年龄,地址)字段 学生管理系统代码思路分析 定义学…...
Rust错误处理
返回值和错误处理 panic 深入剖析 主动调用 fn main() {panic!("crash and burn"); }backtrace 栈展开 panic 时的两种终止方式 当出现 panic! 时,程序提供了两种方式来处理终止流程:栈展开和直接终止 何时该使用 panic! 先来一点背景知…...
Golang操作数据库简单示例
目录 准备工作准备数据创建项目连接数据库查询数据修改数据插入数据删除数据释放资源完整代码最终执行结果 准备工作 在开始之前,你需要确保自己安装了Golang的编程环境,安装MySQL数据库,有一个可以用于编写代码的编辑器或IDE工具。我在这里…...
亚马逊测评,买家号支付不了、砍单率高是什么问题,需要怎么解决
下半年旺季很多卖家都在使用自养号测评给产品冲一波权重,但是很多朋友会遇到下不了单或者砍单率过高等问题。有人以为是支付卡的问题,也有人觉得是IP被关联了。其实他们讲的也没错,但是,亚马逊风控不会针对某个点去进行检测&#…...
B. Jellyfish and Game-Codeforces Round 902 (Div. 2)
B. Jellyfish and Game 交换k轮使得第一个同学拥有数值总数最大; 很容易看出这道题需要判断k奇偶数。 当k是奇数时可以看作第一个同学操作一轮。 k为偶数可以看作两个同学各操作一轮。 #include<iostream> #include<vector> #include<algorithm>…...
Linux下的命令行参数和环境变量
命令行参数 什么是命令行参数 命令行参数是指在执行命令行程序时,给程序传递的额外参数。在Linux终端中,命令行参数通常通过在命令后面添加空格分隔的参数来传递。 Linux下以main函数举例说明 #include<stdio.h>int main(int argc char* argv[])…...
语音芯片KT142C两种音频输出方式PWM和DAC的区别
目录 语音芯片KT142C两种音频输出方式PWM和DAC的区别 一般的语音芯片,输出方式,无外乎两种,即dac输出,或者PWM输出 其中dac的输出,一般应用场景都是外挂功放芯片,实现声音的放大,比如常用的音箱…...
Kotlin 协程的挂起和阻塞的区别
一,简介 Kotlin协程引入了非常强大的异步编程模型,通过挂起而不是阻塞来实现并发操作。以下是有关Kotlin协程挂起和阻塞的详细介绍: 挂起(Suspending): 挂起是指一个协程的执行可以在不阻塞线程的情况下暂…...
解决Github Markdown图片显示残缺的问题
title: 解决Github Markdown图片显示残缺的问题 tags: 个人成长 categories:杂谈 在Github存放Markdown文档,如果图片没有存放在Github服务器上,github会尝试生成Github图片缓存,使用Github图片缓存,进行实际的展示。但比较蛋疼的…...
[MAUI]深入了解.NET MAUI Blazor与Vue的混合开发
文章目录 Vue在混合开发中的特点创建MAUI项目创建Vue应用使用element-ui组件库JavaScript和原生代码的交互传递根组件参数从设备调用Javascript代码从Vue页面调用原生代码 读取设备信息项目地址 .NET MAUI结合Vue的混合开发可以使用更加熟悉的Vue的语法代替Blazor语法ÿ…...
免费AI学习资源全指南:从理论到实践
1. 在线AI教育资源全景概览当我在2018年第一次尝试系统学习机器学习时,面对动辄上万的付费课程和晦涩的学术论文,几乎陷入了绝望。直到偶然发现斯坦福的公开课视频,才意识到原来顶级AI教育资源早已向公众敞开大门。如今五年过去,我…...
usbip-win开发者指南:如何扩展和定制USB/IP功能
usbip-win开发者指南:如何扩展和定制USB/IP功能 【免费下载链接】usbip-win USB/IP for Windows 项目地址: https://gitcode.com/gh_mirrors/us/usbip-win 什么是usbip-win? usbip-win是一个开源项目,它为Windows系统提供了USB/IP&am…...
【学习笔记】车道线识别——图像处理方法
一、图像基本知识 1. HLS:色相,亮度,饱和度 色相通道:确定颜色 亮度通道:亮度信息 饱和度通道:饱和度信息对于颜色区分鲜艳程度很关键。 二、视频读取示例 import cv2if __name__ __main__:video c…...
别再只用句柄了!手把手教你用.NET UIAutomationClient.dll探测微信控件(附避坑指南)
突破传统句柄限制:深入解析.NET UIAutomation框架在微信控件探测中的实战应用 当开发者尝试与微信这类现代应用程序交互时,传统的User32.dll句柄操作往往显得力不从心。那些曾经可靠的FindWindow和WindowFromPoint函数在面对Windows.UI.Core等新型UI框架…...
Conda换源后还是安装失败?试试这个‘组合拳’:官方源+国内源+conda-forge的混合配置指南
Conda混合源配置实战:破解特殊包安装失败的终极方案 当你在深夜赶项目进度时,突然遇到PackagesNotFoundError的红色报错,即使已经配置了国内镜像源也无济于事——这种挫败感每个数据科学工作者都深有体会。传统教程只会教你单一地切换镜像源&…...
CANoe Trace窗口保姆级配置指南:从列显示到颜色字体,打造你的专属分析视图
CANoe Trace窗口高阶配置实战:打造高效诊断视图的5个关键策略 在汽车电子系统开发与测试领域,CANoe的Trace窗口就像工程师的"听诊器",但大多数人只停留在基础使用层面。当面对复杂的车载网络数据流时,未经优化的Trace视…...
从“要我做”到“我要做”:手把手教你用MAS激发团队自驱力(以研发团队为例)
从“要我做”到“我要做”:手把手教你用MAS激发团队自驱力(以研发团队为例) 在技术驱动的时代,研发团队的管理者常常面临一个核心挑战:如何让团队成员从被动执行转向主动创造?传统管理模式下,工…...
从零构建Android 12:AOSP源码编译实战与避坑指南
1. 环境准备:搭建Ubuntu编译环境 编译Android 12源码需要一台性能强劲的Linux机器,我推荐使用Ubuntu 20.04 LTS版本。这个版本不仅长期支持,而且对AOSP编译的兼容性最好。我的开发机是一台32核64GB内存的工作站,配了1TB SSD。如果…...
如何彻底掌控微信聊天记录:本地化数据导出与智能分析完全指南
如何彻底掌控微信聊天记录:本地化数据导出与智能分析完全指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/w…...
深入DAC8563数据手册:用STM32 HAL库SPI实现精密电压输出的几个关键细节
深入DAC8563数据手册:用STM32 HAL库SPI实现精密电压输出的几个关键细节 在嵌入式系统开发中,数字模拟转换器(DAC)的精度往往决定了整个系统的性能上限。DAC8563作为一款16位高精度DAC芯片,其SPI接口与STM32 HAL库的配合使用看似简单ÿ…...
