Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如果网络问题或服务端数据存在问题,这一步获取菜单失败,页面白屏,无任何提示信息 #497

Closed
wants to merge 2 commits into from

Conversation

SpringHgui
Copy link
Contributor

🤔 这个 PR 的性质是?

  • 日常 bug 修复
  • 新特性提交
  • 文档改进
  • 演示代码改进
  • 组件样式/交互改进
  • CI/CD 改进
  • 重构
  • 代码风格优化
  • 测试用例
  • 分支合并
  • 其他

🔗 相关 Issue

💡 需求背景和解决方案

📝 更新日志

  • fix(组件名称): 处理问题或特性描述 ...

  • 本条 PR 不需要纳入 Changelog

☑️ 请求合并前的自查清单

⚠️ 请自检并全部勾选全部选项⚠️

  • 文档已补充或无须补充
  • 代码演示已提供或无须提供
  • TypeScript 定义已补充或无须补充
  • Changelog 已提供或无须提供

@github-actions
Copy link
Contributor

github-actions bot commented May 11, 2023

完成

@timi137137
Copy link
Collaborator

#487 已经做了相关预防措施,请勿多此一举

@timi137137 timi137137 closed this May 11, 2023
@SpringHgui
Copy link
Contributor Author

SpringHgui commented May 11, 2023

  1. await userStore.getUserInfo(); 处防护了,不代表await permissionStore.buildAsyncRoutes();一定不会异常,你怎么保证?
  2. await userStore.getUserInfo() 这里未见得所有系统都去访问后端,JWTtoken中包含用户信息,和token的过期时间,完全可以不需要访问后端就能拿到用户信息,这里即使没网也不会异常,而且能获取用户信息,这时候await permissionStore.buildAsyncRoutes();就可能会出现白屏。
  3. await permissionStore.buildAsyncRoutes()处捕获异常我只提到是网络问题的情况下这一场景,即使网络正常,如果后端返回的菜单数据存在问题buildAsyncRoutes也会出现异常,此时也会白屏!

@timi137137
Copy link
Collaborator

timi137137 commented May 11, 2023

如果你不熟读代码就来贡献的话,所有不合理的pr将被关闭
image
image
在此处,buildAsyncRoutes并非对后端发起请求,问题自会出现在
image
这个地方已经自带了try catch,如果你说的后端数据有问题那么前端只会直接抛error
并且因为性能损耗原因并不会try套try
再且,如果真的很担心有问题要用try套try你大可以在自己的仓库进行修改,该类pr不予合并

@SpringHgui
Copy link
Contributor Author

那上面的情况造成的白屏怎么解决?在这里加 MessagePlugin.error(error.message); ?
image

@SpringHgui
Copy link
Contributor Author

Can't build routes 这个异常出现的时候,你看看现在的代码是不是就是白屏一个

@PDieE
Copy link
Contributor

PDieE commented May 11, 2023

正常情况下获取用户信息那边出了问题的话会直接跳转到login页面,所以后面的流程就不会再运行了
像你说的这种情况,大概率是 获取用户信息那边没有正确的在出问题的情况下跳转到login页面

@PDieE
Copy link
Contributor

PDieE commented May 11, 2023

再者Can't build routes事实上就是为了提示开发者,这边处理错误了,错误的原因大概率是数据格式不正确或其他,现实到了线上的话肯定要按照各自公司的产品需求去处理问题

@SpringHgui
Copy link
Contributor Author

正常情况下获取用户信息那边出了问题的话会直接跳转到login页面,所以后面的流程就不会再运行了 像你说的这种情况,大概率是 获取用户信息那边没有正确的在出问题的情况下跳转到login页面

获取用户信息正确的情况,不代表buildAsyncRoutes就一定不异常,前面已经说过了

@SpringHgui
Copy link
Contributor Author

生成环境不能展示白屏,什么都不提示的情况,很难排查错误,用户可不会F12去排错

@PDieE
Copy link
Contributor

PDieE commented May 11, 2023

生产环境,出现这种情况,要么是调试的时候没有调试全情况,要么就是接口炸了,

@PDieE
Copy link
Contributor

PDieE commented May 11, 2023

接口都炸了 前端还能怎么样,顶多就是做个错误页面呗

@SpringHgui
Copy link
Contributor Author

后端动态菜单可能每个人的菜单都不一样,可能只有某个人的数据存在问题,才会出现这个问题,这个白屏时NProgress还在执行,给人一种网络延迟的假象,用户还在傻傻等他加载到头

@SpringHgui
Copy link
Contributor Author

  1. 项目维护人员是不是先问自己:这个问题是否存在?
  2. 即使这个处理比较简单,不太完美,你可以选择不接受pr!
    我的评价是:态度极其差

@rjl-cli
Copy link

rjl-cli commented May 11, 2023

  1. 项目维护人员是不是先问自己:这个问题是否存在?
  2. 即使这个处理比较简单,不太完美,你可以选择不接受pr!
    我的评价是:态度极其差
    不需要你评价,组件库的本质是界面的交互。不是处理业务逻辑。模板也一样。开源的东西,别把你自己当成甲方爸爸了。
    如果那个逻辑你自己都不会加。不会改,呵呵

@uyarn
Copy link
Collaborator

uyarn commented May 11, 2023

都冷静点 都是为了让项目更好 观点不一致可以交流也需要交流

@SpringHgui
Copy link
Contributor Author

我有义务给你优化很完美吗?写个前端代码给你牛逼毁了

  1. 项目维护人员是不是先问自己:这个问题是否存在?
  2. 即使这个处理比较简单,不太完美,你可以选择不接受pr!
    我的评价是:态度极其差
    不需要你评价,组件库的本质是界面的交互。不是处理业务逻辑。模板也一样。开源的东西,别把你自己当成甲方爸爸了。
    如果那个逻辑你自己都不会加。不会改,呵呵

@rjl-cli
Copy link

rjl-cli commented May 11, 2023

写个前端代码给你牛逼毁了

我有义务给你优化很完美吗?这句话送给你,专业的事,由专业的人做。

@rjl-cli
Copy link

rjl-cli commented May 11, 2023

我有义务给你优化很完美吗?写个前端代码给你牛逼毁了

  1. 项目维护人员是不是先问自己:这个问题是否存在?
  2. 即使这个处理比较简单,不太完美,你可以选择不接受pr!
    我的评价是:态度极其差
    不需要你评价,组件库的本质是界面的交互。不是处理业务逻辑。模板也一样。开源的东西,别把你自己当成甲方爸爸了。
    如果那个逻辑你自己都不会加。不会改,呵呵

我有义务给你优化很完美吗? 写个前端代码给你牛通毁了
你自己没有,别人就有?

@SpringHgui
Copy link
Contributor Author

不知道还以为这项目是你个人开源的,你算个什么东西,别给项目抹黑了

@yixiaco
Copy link

yixiaco commented May 11, 2023

一般会在request拦截器中统一处理服务端返回的错误,因此这里如果也做提示,则发生两次消息。如果其实有必要的话跳转到错误页会更好一点

@SpringHgui
Copy link
Contributor Author

一般会在request拦截器中统一处理服务端返回的错误,因此这里如果也做提示,则发生两次消息。如果其实有必要的话跳转到错误页会更好一点

当目前都没一个人能理解什么时候会白屏,就这水平有什么优越感?

@timi137137
Copy link
Collaborator

一般会在request拦截器中统一处理服务端返回的错误,因此这里如果也做提示,则发生两次消息。如果其实有必要的话跳转到错误页会更好一点

同意你的看法,并且在代码中有预留该位置
image

@SpringHgui
Copy link
Contributor Author

是接口正常,接口数据存在问题的情况

@SpringHgui
Copy link
Contributor Author

按照你们理解,这里的try也是多余
image

@SpringHgui
Copy link
Contributor Author

不知道还以为这项目是你个人开源的,你算个什么东西,别给项目抹黑了

@rjl-cli

@rjl-cli
Copy link

rjl-cli commented May 11, 2023

我知道了,你

不知道还以为这项目是你个人开源的,你算个什么东西,别给项目抹黑了

@rjl-cli

我知道你不是个东西。你现实很自卑吧?

@SpringHgui
Copy link
Contributor Author

我知道了,你

不知道还以为这项目是你个人开源的,你算个什么东西,别给项目抹黑了

@rjl-cli

我知道你不是个东西。你现实很自卑吧?

我是你爸,我能优越啥呢

@uyarn
Copy link
Collaborator

uyarn commented May 11, 2023

@SpringHgui @rjl-cli 这个PR暂时按不接受处理 大家都冷静点 拜托 🙏 @SpringHgui 谢谢这个PR 如果有其他贡献交流另开一个PR

@rjl-cli
Copy link

rjl-cli commented May 11, 2023

我知道了,你

不知道还以为这项目是你个人开源的,你算个什么东西,别给项目抹黑了

@rjl-cli

我知道你不是个东西。你现实很自卑吧?

我是你爸,我能优越啥呢

原来是得狂犬病了

@SpringHgui
Copy link
Contributor Author

@SpringHgui @rjl-cli 这个PR暂时按不接受处理 大家都冷静点 拜托 🙏 @SpringHgui 谢谢这个PR 如果有其他贡献交流另开一个PR

  1. 有些人一看说话就知道是大佬,不合并没任何问题,我也是简单做下处理,如果项目负责人意识知道有这个问题自然会抽空优化的很完美。
  2. 有些菜鸡就tm态度差!是不是腾讯给你开的工资太低了,不满意,很暴躁?

@SpringHgui
Copy link
Contributor Author

我知道了,你

不知道还以为这项目是你个人开源的,你算个什么东西,别给项目抹黑了

@rjl-cli

我知道你不是个东西。你现实很自卑吧?

我是你爸,我能优越啥呢

原来是得狂犬病了

还不是你咬得,头像是你自拍吧

@Ha-ei
Copy link

Ha-ei commented May 11, 2023

@SpringHgui 不好意思,这 @rjl-cli 是我家🐕,没拴好,没咬到你吧。

@SpringHgui
Copy link
Contributor Author

@SpringHgui 不好意思,这 @rjl-cli 是我家🐕,没拴好,没咬到你吧。

早打疫苗,对疯狗免疫

@masonTool
Copy link

不管题主pr的质量怎么样. 组件还是应该有一个友好的异常处理, 如果接口炸了还有没有一种更友好的展示方式, 而不是白屏呢?

@timi137137
Copy link
Collaborator

不管题主pr的质量怎么样. 组件还是应该有一个友好的异常处理, 如果接口炸了还有没有一种更友好的展示方式, 而不是白屏呢?
@masonTool 谢谢你的提问,关于提问的回答如下

在上述回答中,有提到关于request工具预留的错误处理占位,接口炸了这种情况我们并无法将所有人的情况囊括在内,比如有的人认为204无内容是报错,但有的人会认为204无内容是正常返回。模板为了兼顾通用性仅会预留出位置让用户自行修改

回到主题,避免白屏的情况是可以解决的直接跳转到/result/network-error页面不就可以了?但是我们考虑到在开发环境下出现错误是需要debug的,如果无差别跳转只会导致debug成本过高,这样会不会看起来合理许多?

@SpringHgui
Copy link
Contributor Author

SpringHgui commented May 11, 2023

不管题主pr的质量怎么样. 组件还是应该有一个友好的异常处理, 如果接口炸了还有没有一种更友好的展示方式, 而不是白屏呢?
@masonTool 谢谢你的提问,关于提问的回答如下

在上述回答中,有提到关于request工具预留的错误处理占位,接口炸了这种情况我们并无法将所有人的情况囊括在内,比如有的人认为204无内容是报错,但有的人会认为204无内容是正常返回。模板为了兼顾通用性仅会预留出位置让用户自行修改

回到主题,避免白屏的情况是可以解决的直接跳转到/result/network-error页面不就可以了?但是我们考虑到在开发环境下出现错误是需要debug的,如果无差别跳转只会导致debug成本过高,这样会不会看起来合理许多?

不是拦截器能拦截的,请看这里 #500 ,不是所有的问题都能开发阶段解决的,因为服务端数据是动态的,你没法保证每次返回的数据都是正确被解析和渲染菜单的,也就是说这里你不做处理,到了生产项目则就会发生白屏,问题存在就想办法解决,而不是想办法解决提出问题的人。

@SpringHgui
Copy link
Contributor Author

SpringHgui commented May 11, 2023

比如这种情况 #500 (comment) ,拦截器怎么拦截?讲了那么久还没整明白这bug什么情况发生?

@SpringHgui SpringHgui changed the title 如果网络问题或服务端问题,这一步获取菜单失败,页面白屏,无任何提示信息 如果网络问题或服务端数据存在问题,这一步获取菜单失败,页面白屏,无任何提示信息 May 11, 2023
@latel
Copy link

latel commented May 11, 2023

腾讯的晋级项目你也敢用, 答辩一过管他洪水滔天。 看看那个wepy

@Senorsen
Copy link

在 discussion 评论了一下,不过可能没啥人看,在这里也粘贴一下
#500 (comment)

(看了一眼项目的 releases 和 pull requests ,应该是个中文社区,如果不对请指出,谢谢)

既然这里是讨论区,还是发个评论支持楼主一下,应该也不算是灌水。

尽管楼主发的 PR 可能不那么完美,比如可能文本介绍的没那么详细(指的是 PR 正文中的“需求背景和解决方案”和“更新日志”部分);也许可能 @timi137137 曾面对过或正在面对大量灌水、无意义的 issue 和 pull request ,因此耐心很有限。

但楼主这个 PR 可以一眼看出来是确实遇到了实际问题,进行了 debug 并找到了一种可行的解决方式,并付出一定的时间精力无偿来提 pull request,我认为至少是值得尊重和平等沟通的。

#487 已经做了相关预防措施,请勿多此一举
如果你不熟读代码就来贡献的话,所有不合理的pr将被关闭

而从“多此一举”等其他言论中,让人感受到这个社区是极其不友好、不尊重开发者的。别人贡献付出的时间精力,在你的眼中只是“多此一举”。这不是一个社区该有的样子,这种行为会极大的损害楼主等其他开发者在你们社区甚至整个中文社区的热情和积极性。

哪怕这个 PR 不是你需要的,也请有一点礼貌和尊重,有一点包容。

@SpringHgui
Copy link
Contributor Author

SpringHgui commented May 11, 2023

腾讯的晋级项目你也敢用, 答辩一过管他洪水滔天。 看看那个wepy
image

这个不知道能不能活下来,wepy之前也参与贡献过,现在已经不维护了,可惜了~,已全部迁移到Taro框架

@masonTool
Copy link

腾讯的晋级项目你也敢用, 答辩一过管他洪水滔天。 看看那个wepy

不要因为一个人的态度问题, 质疑一群人的努力

@timi137137
Copy link
Collaborator

本人以个人身份仅代表个人言论和行为,请勿牵扯至任何组织,公司,团队
以下是我最后回复相关问题,包括 #497 #500

@Senorsen 首先我很感谢你总结出来了整个问题所在并且公平的看待所有情况,对此我表示很感谢。
其次,我对自己的回复部分用词不当过激行为向各位所有人道歉,对不起。
首先,我也是从题主这个时期走过来的,我在以往也被开源社区的核心贡献者“们”喷过,但是当我学的更多了,到达了现在这个水平,我回过头去看当初我发的issue,我顿时明白我为什么会被喷了。因此我在这里引用他们给我的一句话
XXX(某开源社区) 是开源社区一起维护起来的。靠的是大家的帮助和努力,如果你觉得 XXX 不好,你可以选择让他变得更好或者不要使用。你是 XXX 的用户,而不是客户,请不要摆出一副你是客户的姿态。
如果你觉得以你的知识不够解决或处理某些问题,那么就去学,而不是要求他人必须为你着想。社区没有这个义务和责任

我相信许多人看完就会理解一些我的行为了,不过在此我强调一点。我,只是个免费为爱发电的贡献者,并非腾讯员工,我并不是你口中说的
image

在这里,我再一次对我用词不当过激行为向各位所有人道歉。但是,题主你应该清楚地理解上面说的一句话
如果你觉得以你的知识不够解决或处理某些问题,那么就去学,而不是要求他人必须为你着想。社区没有这个义务和责任
我没有义务教会你什么,也没有义务为了你的问题去解决什么,这一点毋庸置疑。

image
关于上图所示,我已经明确给出回应,在代码中的store和request工具都已经为你提出了所有可行性方案,如果你认为不够稳定不够安全,你可以自行修改,毕竟这是模板,并没有限制任何人clone使用

后面你提出的问题
image
对此已经有其他贡献者为你回复了
image
按照设计来说,如果出现白屏那么就是在开发环境中并没有处理完所以必现的问题,当代码本身就有问题的时候,我并没有办法去处理,除非你们希望学习Thinkphp那样将所有报错track输出到外面,然后一部分人发生产环境不记得关闭的时候,就会引发一系列P0漏洞,这个时候被骂的不还是我吗?
image
何况模板中自带了许多错误页面,出错了使用router.push在request中拦截并跳转到错误页面不就能行的通吗?
image
image
我相信对于你问出的,接口正常但是数据有误的问题在注释中也写的很清楚了。如果你需要大家跟着你的想法去做,我觉得你需要一个外包团队。

以下我会对你有疑惑的地方进行排错

  // Token是否存在?如果不存在,跳转到登录页面强制登录
  if (token) {
    
    // 要前往的页面是登录页面?如果是,直接跳转到登录页面
    if (to.path === '/login') {
      next();
      return;
    }
    
    // 错误预处理
    try {
      // 尝试获取用户信息
      await userStore.getUserInfo();
    } catch (error) {
      // 如果获取用户信息失败,跳转到登录页面强制登录
      MessagePlugin.error(error);
      next({
        path: '/login',
        query: { redirect: encodeURIComponent(to.fullPath) },
      });
      NProgress.done();
    }

    // 如果获取用户信息成功,则认为用户已经登录,后端正常
    const { asyncRoutes } = permissionStore;

    // 如果没有动态路由,尝试获取动态路由
    if (asyncRoutes && asyncRoutes.length === 0) {
      // 获取动态路由表
      const routeList = await permissionStore.buildAsyncRoutes();
      
      // 遍历动态路由表,添加到路由器中
      routeList.forEach((item: RouteRecordRaw) => {
        // 此处不会出错,因为item强制规范为RouteRecordRaw类型,除非手动修改any
        router.addRoute(item);
      });
async initRoutes() {
      const accessedRouters = this.asyncRoutes;

      // 在菜单展示全部路由
      this.routers = [...homepageRouterList, ...accessedRouters, ...fixedRouterList];
      // 在菜单只展示动态路由和首页
      // this.routers = [...homepageRouterList, ...accessedRouters];
      // 在菜单只展示动态路由
      // this.routers = [...accessedRouters];
    },
    async buildAsyncRoutes() {
      // 错误预处理
      try {
        // 发起菜单权限请求 获取菜单列表
        const asyncRoutes: Array<RouteItem> = (await getMenuList()).list;

        // 转换菜单列表为路由列表
        this.asyncRoutes = transformObjectToRoute(asyncRoutes);

        // 初始化路由
        await this.initRoutes();

        // 返回路由列表
        return this.asyncRoutes;
      } catch (error) {
        // 如果在上面任何一步出现错误都将会在控制台打印错误信息
        // 当出现该情况时,证明代码不应该放到生产环境中,因为该错误会导致路由无法正常加载
        throw new Error("Can't build routes");
      }
    },
  // 处理请求数据。如果数据不是预期格式,可直接抛出错误
  transformRequestHook: (res, options) => {
    const { isTransformResponse, isReturnNativeResponse } = options;

    // 如果204无内容直接返回
    const method = res.config.method?.toLowerCase();
    if (res.status === 204 || method === 'put' || method === 'patch') {
      return res;
    }

    // 是否返回原生响应头 比如:需要获取响应头时使用该属性
    if (isReturnNativeResponse) {
      return res;
    }
    // 不进行任何处理,直接返回
    // 用于页面代码可能需要直接获取code,data,message这些信息时开启
    if (!isTransformResponse) {
      return res.data;
    }

    // 错误的时候返回
    const { data } = res;
    if (!data) {
      // router.push('/login'); 或者其他操作
      throw new Error('请求接口错误');
    }

    //  这里 code为 后台统一的字段,需要在 types.ts内修改为项目自己的接口返回格式
    const { code } = data;

    // 这里逻辑可以根据项目进行修改
    const hasSuccess = data && code === 0;
    if (hasSuccess) {
      return data.data;
    }

    throw new Error(`请求接口错误, 错误码: ${code}`);
  },
Error: Route paths should start with a " /": "list" should be "/list".
错误:路由路径应该用斜杠做为起始符,“list” 应该是 “/list”

该错误来自于Vue-Router4

在回答最后我再一次郑重地为自己过激的用词向各位道歉

@Tencent Tencent locked as resolved and limited conversation to collaborators May 11, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

10 participants