vue3+vue-router4:报错Uncaught (in promise) Error: Invalid navigation guard

报错图示:

Error: Invalid navigation guard
Uncaught (in promise) Error: Invalid navigation guard
在这里插入图片描述

错误影响描述:

配置开发、测试、生产时候,因为是公众号,所以想在开发环境下免鉴权,不走微信获取openid接口,pinia中定义好openid直接进入项目,遂遇此问题。
因为在async和await中使用,导致next()不能正确执行,查看源码,因为在非生产环境做了此限制,所以只要是生产环境就没问题,但是我就是要dev使用呀。

错误代码示例:
// vant4函数形式的组件
import '@/assets/js/vant4.js'
import '@/assets/css/main.css'
import { getQueryString } from '@/assets/js/common.js'
import { showToast } from 'vant'import { createApp } from 'vue'
import App from './App.vue'
import router from '@/router/index'
// pinia 共享仓库
import { createPinia ,storeToRefs } from "pinia";
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
// 接口
import { getWechatInfoByCode ,getByOpenid } from '@/api/index'
import { useStore } from '@/store/index'const pinia = createPinia()
const app = createApp(App)
// 数据持久化
pinia.use(piniaPluginPersistedstate);
// 环境变量挂在全局
app.config.globalProperties.$getEnv = import.meta.envapp.use(pinia)
app.use(router)
app.mount('#app')// 路由守卫 start
router.beforeEach( async (to, from, next) => {const store = useStore();// 必须storeToRefs绑定否则拿不到最新值const { openid } = storeToRefs(store);const { VITE_HOST , VITE_APPID } = import.meta.env// 微信公众号appid-开发-基本配置中获取const appId = VITE_APPID// 获取code后再次跳转路径 window.location.href;例:www.baido.com/#/Homeconst toPath = VITE_HOST + '/#' + to.path// 核心步骤,获取codeconst hrefurl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appId + "&redirect_uri=" + encodeURIComponent(toPath) + "&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";// 从地址栏获取codeconst code = getQueryString('code')// 有openid就放行,单纯为了获取openid,无需关心是否登录,绑定等const haveOpenidPass = ['/bindAccount' , '/register']// 是否账号绑定了openid  const isBindAccount = async () => {const resGetInfo = await getByOpenid({ openid: openid.value })if(resGetInfo.code === 0){if(resGetInfo.data){// 已绑定store.setLoginInfo(resGetInfo.data)// dev test 环境都会跳转失效并报错,生产可以正常跳转无报错 !!!next()}else{// 未绑定 // 清空store用户信息store.setLoginInfo({user:{Uid:''}})// contactUs 相当于注册,直接通过if(to.path == '/contactUs'){// dev test 环境都会跳转失效并报错,生产可以正常跳转无报错 !!!next()}else{next({path: '/register'})}         }}else{// 请求失败,放行showToast(resGetInfo?.info || '请求失败!');next()}}/* 路由发生变化修改页面title */if (to.meta.title) {document.title = to.meta.title;}/* 判断该路由是否需要登录权限 */if (to.matched.some(record => record.meta.requireAuth)) {if (openid.value) {if(haveOpenidPass.includes(to.path)){next()}else{// !!!错误的根源在此 !!!isBindAccount()} } else { //openId不存在if (code) { //根据code获取openIdconst res = await getWechatInfoByCode({ code })if (res && res.code == 0) {store.setOpenid(res.data.openid)isBindAccount()} else {showToast(res?.info || '请求失败!');}} else {  //获取codewindow.location.replace(hrefurl)}}} else {next()}
})
// 路由守卫 end
解决方式:

只需要给isBindAccount()函数调用时候加个return就行。

// vant4函数形式的组件
import '@/assets/js/vant4.js'
import '@/assets/css/main.css'
import { getQueryString } from '@/assets/js/common.js'
import { showToast } from 'vant'import { createApp } from 'vue'
import App from './App.vue'
import router from '@/router/index'
// pinia 共享仓库
import { createPinia ,storeToRefs } from "pinia";
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
// 接口
import { getWechatInfoByCode ,getByOpenid } from '@/api/index'
import { useStore } from '@/store/index'const pinia = createPinia()
const app = createApp(App)
// 数据持久化
pinia.use(piniaPluginPersistedstate);
// 环境变量挂在全局
app.config.globalProperties.$getEnv = import.meta.envapp.use(pinia)
app.use(router)
app.mount('#app')// 路由守卫 start
router.beforeEach( async (to, from, next) => {const store = useStore();// 必须storeToRefs绑定否则拿不到最新值const { openid } = storeToRefs(store);const { VITE_HOST , VITE_APPID } = import.meta.env// 微信公众号appid-开发-基本配置中获取const appId = VITE_APPID// 获取code后再次跳转路径 window.location.href;例:www.baido.com/#/Homeconst toPath = VITE_HOST + '/#' + to.path// 核心步骤,获取codeconst hrefurl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appId + "&redirect_uri=" + encodeURIComponent(toPath) + "&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";// 从地址栏获取codeconst code = getQueryString('code')// 有openid就放行,单纯为了获取openid,无需关心是否登录,绑定等const haveOpenidPass = ['/bindAccount' , '/register']// 是否账号绑定了openid  const isBindAccount = async () => {const resGetInfo = await getByOpenid({ openid: openid.value })if(resGetInfo.code === 0){if(resGetInfo.data){// 已绑定store.setLoginInfo(resGetInfo.data)next()}else{// 未绑定 // 清空store用户信息store.setLoginInfo({user:{Uid:''}})// contactUs 相当于注册,直接通过if(to.path == '/contactUs'){next()}else{next({path: '/register'})}         }}else{// 请求失败,放行showToast(resGetInfo?.info || '请求失败!');next()}}/* 路由发生变化修改页面title */if (to.meta.title) {document.title = to.meta.title;}/* 判断该路由是否需要登录权限 */if (to.matched.some(record => record.meta.requireAuth)) {if (openid.value) {if(haveOpenidPass.includes(to.path)){next()}else{// 处理非prod环境下,控制台异常,报错无法跳转问题return isBindAccount()} } else { //openId不存在if (code) { //根据code获取openIdconst res = await getWechatInfoByCode({ code })if (res && res.code == 0) {store.setOpenid(res.data.openid)isBindAccount()} else {showToast(res?.info || '请求失败!');}} else {  //获取codewindow.location.replace(hrefurl)}}} else {next()}
})
// 路由守卫 end
备注:

vue3的ref变量使用必须加.value,卧槽,反人类啊,开倒车!!!经常忘记,导致我疯狂debug

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

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

相关文章

potplayer放大画面,画面拖拽。备份

放大画面: 按住alt和鼠标左键,就可以拖动放大后的画面了 窗口化示图

Alluxio初见

Alluxio学习指南 在当今的大数据时代,数据处理和存储的需求变得越来越庞大和复杂。为了解决这些挑战,Alluxio作为一个开源分布式虚拟文件系统应运而生。本篇博客将向您介绍Alluxio的基本概念、架构和使用方法,帮助您更好地理解和应用Alluxio。 Alluxio是什么? Alluxio是…

【DC-DC】APS54083 降压恒流驱动器大功率深度调光 舞台 RGB 汽车照明 台灯驱动芯片

产品描述 APS54083 是一款 PWM 工作模式,高效率、外围简单、外置功率 MOS 管,适用于 5-220V 输入高精度降压 LED 恒流驱动芯片。输出最大功率150W最大电流 6A。APS54083 可实现线性调光和 PWM 调光,线性调光脚有效电压范围 0.5-2.5V.PWM 调光频率范围 1…

学习babylon.js --- [3] 开启https

babylonjs提供WebVR功能,但是使用这个功能得用https,本文讲述如何使用自签名证书来开启https,基于第二篇文章中搭建的工程。 一 生成自签名证书 首先要安装openssl,这个去网上搜下就行了。安装完之后在终端下输入openssl回车可以…

MongoDB

MongoDB概述 MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 它支持的数据结构非…

状态模式:游戏、工作流引擎中常用的状态机是如何实现的?

从今天起,我们开始学习状态模式。在实际的软件开发中,状态模式并不是很常用,但是在能够用到的场景里,它可以发挥很大的作用。从这一点上来看,它有点像我们之前讲到的组合模式。 可以简短的回顾一下组合模式&#xff1a…

题解 | #牛群排列去重#

题解 | #牛群排列去重# 知识点:链表,遍历 思路:遍历,遇到重复记录节点,继续寻找到下一个界点,需要注意一点是小心最后的节点为null,入门题不多说import java.uti 国电南自提前批2024 面试快一个月了&…

uniapp安卓签名证书生成,签名证书的SHA1,SHA256,MD5获取

uniapp安卓证书生成有两种方式,一种是去dcloud开发者中心生成证书,另一种是安装jre环境,自己生成证书 第一种 dcloud生成证书 去该项目对应的应用处,生成证书需要等几分钟,生成后可以查看证书信息 第二种 自己生成…

注解方式实现数据库字段加密与解密

目录 前言实现步骤定义注解加密工具类定义mybatis拦截器 总结 前言 一些敏感信息存入数据需要进行加密处理,比如电话号码,身份证号码等,从数据库取出到前端展示时需要解密,如果分别在存入取出时去做处理,会很繁锁&…

如何下载SRA存放在AWS的原始数据

通常,我们都是利用prefetch从NCBI上获取数据,然后用fasterp-dump/fastq-dump 转成fastq。但遗憾的SRA的数据是原数据的有损压缩,比如说我19年参与发表的文章里单细胞数据上传的是3个文件,但是当时的faster-dump/fastq-dump只能拆出…

【ArcGIS Pro二次开发】(46):要素类从上到下、从左到右排序

要素类经过编辑之后,【OBJECTID】字段会变得不规律。应部分网友要求,做了这个从上到下、从左到右排序的工具。 不过后来在ArcGIS Pro中发现了一个【排序】工具,已经可以完美实现这个功能需求,发现自己做了个白工。 不过做了不能白…

Ghost Buster Pro for mac(快速清理卸载的应用残存文件)

Ghost Buster Pro for mac可从您已卸载的应用程序中查找并删除文件。该应用程序速度快如闪电,可立即释放内存。 许多应用程序都安装在计算机上,但它们通常只会在您的计算机上停留很短的时间。每个应用程序都会创建文件,但删除应用程序不会删…

若依字典使用

若依字典使用 此文章使用的若依是大于3.7.0版本的 JS文件配置 main.js中引入全局变量和方法 import DictData from /components/DictData DictData.install()DictData.js配置 可以从DictData.js中看出在install方法中调用了字典查询接口,在install方法中可以做…

前端 | (五)CSS三大特性及常用属性 | 尚硅谷前端html+css零基础教程2023最新

学习来源:尚硅谷前端htmlcss零基础教程,2023最新前端开发html5css3视频 文章目录 📚CSS三大属性🐇层叠性🐇继承性🐇优先级 📚CSS常用属性🐇像素的概念🐇颜色的表示⭐️表…

火狐安卓版支持油猴了!后面将支持更多扩展插件

日前火狐浏览器每夜构建版的安卓版已经带来了更多扩展程序支持,这其中就包括大名鼎鼎的油猴扩展程序。本次火狐浏览器每夜构建版更新新增五款扩展程序支持,并且按照谋智基金会说法还会支持更多的扩展程序。 下载地址:https://ftp.mozilla.org…

【论文阅读】关于图像复杂度的论文

1997-An image embedding in image by a complexity based region segmentation method: 根据位平面的(边缘/图像像素数)计算复杂度 2012-https://journals.sagepub.com/doi/abs/10.1068/p6987: 对于象形文字,当将复…

WEB:FlatScience

背景知识 sql注入 SQLite数据库知识 SQLite3注入方法 题目 用dirsearch进行扫描,下面几个关键目录:robots.txt,login.php,admin.php,剩下的目录就是一些pdf格式的论文了 一个一个访问并查看源代码,在查看l…

ThinkPHP使用having时,同时使用分页会报错的解决方法

当使用ThinkPHP的分页查询时,如果与having同时使用,可能会出现错误。这是因为having会影响分页查询的结果。 解决方法是,先不要使用分页查询,先查询出所有数据,再使用array_slice函数对数据进行分页。示例代码如下&am…

【二分查找】275. H 指数 II

📍前言 🕺作者: 迷茫的启明星 学习路线C语言从0到1C初阶数据结构从0到1 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对…