vue.js - 如何处理在 Nuxt 中崩溃页面渲染的 apollo 客户端错误?
问题描述
我目前正在维护一个生产 Nuxt.js Vue 应用程序,该应用程序集成了 GraphQL Apollo 客户端,该客户端运行到页面呈现错误中。为了增加获得响应的机会,我构建了一个简单的代码示例,仅展示我们遇到的问题。谢谢大家。
源代码
- 客户端,https://github.com/sgarcia-dev/error-apollo-client-nuxt
- 服务器,https://github.com/sgarcia-dev/error-apollo-server
问题
问题在于,我们所依赖的 GraphQL 服务器(我们无法控制它)时不时地出现故障并返回一个 HTML 错误页面,这导致 Apollo 客户端由于尝试解析 GraphQL 规范 JSON 响应而崩溃。这产生了一遍又一遍地Unexpected token < in JSON at position 0
报告的臭名昭著的错误。
问题是,因为我们使用了@nuxt/apollo
将 Apollo 集成到渲染管道中的 Nuxt 模块,这使得 Nuxt 的页面渲染崩溃。给我们一个看起来像这样的通用服务器渲染错误页面;
ERROR Network error: Unexpected token < in JSON at position 0 08:11:04
at new ApolloError (node_modules/apollo-client/bundle.umd.js:92:26)
at node_modules/apollo-client/bundle.umd.js:1588:34
at node_modules/apollo-client/bundle.umd.js:2008:15
at Set.forEach (<anonymous>)
at node_modules/apollo-client/bundle.umd.js:2006:26
at Map.forEach (<anonymous>)
at QueryManager.broadcastQueries (node_modules/apollo-client/bundle.umd.js:2004:20)
at node_modules/apollo-client/bundle.umd.js:1483:29
at processTicksAndRejections (node:internal/process/task_queues:94:5)
如何重现错误
从上面克隆存储库,并按照 readme.md 命令启动它们。(对于服务器错误,请确保运行,npm run start-express
因为那是导致客户端崩溃的错误)。
你会注意到pages/index.js抛出了一个服务器错误页面,因为服务器返回了一个无效的 HTML 响应。
我们尝试了什么
我们尝试遵循 Vue Apollo 和 Nuxt apollo 文档中的每个错误处理规范,但似乎没有任何效果。我们尝试了:
- 添加 Nuxt "@apollo/nuxt" 模块支持的错误处理程序语法。它被正确记录,但错误不会停止传播并使页面渲染崩溃。即使我们最后返回 false。我们认为那会,因为这就是vue-apollo 的源代码似乎所做的
- 设置 apollo 客户端errorPolicy和
ignore
,all
但错误仍然通过并导致页面渲染崩溃 - 添加单独的查询
error()
处理程序,而不是依赖于全局查询处理程序。他们停止了向全局页面的传播,但并没有阻止页面呈现错误的发生。 - 通过向我们的 nuxt apollo 配置添加属性并遵循这些步骤来使用忽略错误
apollo-link-error
的方法。链接配置运行,并且确实记录了错误。但在该示例中,计算结果为未定义,阻止我们执行. 我认为它的 Nuxt 兼容性问题是 SSR 和所有,并且这可能是为 React 应用程序设计的。link
response
response.error
概括
即使是使用 nuxt/apollo 模块的简单页面崩溃页面也会在无效的 GraphQL 响应上呈现,我们不知道如何阻止它发生,除了将我们的应用程序从使用 nuxt/apollo 迁移到直接使用 apollo 客户端,这将非常昂贵。 ... 有任何想法吗?
解决方案
是否可以通过计算属性(显示在模板中)运行您的阿波罗查询。这样,您可以在计算属性中检查 JSON 错误并在其中捕获它们,然后再将它们提供给模板渲染过程。
推荐阅读
- jqgrid - 网格不会填充在 free-jqgrid 中
- javascript - 如何在画布中旋转对象时使用键盘射击子弹 360*?
- r - 如何使用R在最接近的数值上合并两个长度不均匀的数据结构
- react-native - 反应原生 | 默认设置宽度样式
- ios - 将 iOS 小部件添加到 macOS 目标
- java - 有没有一种优雅的方法来检查许多条件并调用相应的函数?
- php - 使用myth-auth Codeigniter 4登录后重定向到上一页
- r - 在 R 中添加白天/黄昏/夜晚/黎明的信息以跟踪数据
- kubernetes - 我的集群中的 pod 可以获取服务中的 pod 列表吗?
- spring-boot - 如何在 Arrays.asList().contains() 的单元测试中返回 true