nuxt3中出错时的常用处理方式

nuxt3中出错时的常用处理方式

nuxt3是一个全栈框架,所以项目中错误产生的来源也会有多个地方。

错误产生的地方。

总的来说,错误主要会出现在三个不同的上下文中:

1. vue渲染生命周期(SSR + SPA)中产生的错误。

你可以在onErrorCaptured中处理Vue中的错误。同时Nuxt3也提供了vue::error钩子,这种钩子会拦截所有可以传到最上层的错误。如果你正在使用一个错误上报的库或者框架,你可以将一个全局处理函数设置给vueApp.config.errorHandler,这样它就可以接收到所有的Vue错误,即使这些错误已经被处理过了。
示例:

export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.vueApp.config.errorHandler = (error, context) => {
    // ...
  }
})

2. API调用和Nitro服务中产生的错误。

目前这些地方的错误还不处理,但你可以在这些地方产生错误时显示一个错误页面。

3. 服务端和客户端启动时产生的错误(SSR + SPA)

如何在启动nuxt应用时产生了任何错误, Nuxt都会调用app:error钩子。
其中错误可能产生的地方:

  • 正在执行中的插件。
  • app:createdapp:beforeMount钩子中。
  • 客户端挂载应用时,当然你也可以在onErrorCaptured或者vue:error中处理此处的错误。
  • app:mounted钩子中。

显示一个错误页面。

在服务端生命周期或者渲染你的vue应用(SSR和SPA)中出现严重错误时,要么返回一个出错的json数据要么返回一个HTML错误页。
通过在项目根目录中添加一个error.vue,你可以定制化这个出错页。在这个页面中只有一个error属性。其中包含了你要处理的错误。
当你准备移除这个错误页时,你可以调用clearError函数,这个函数带有一个可选的path参数,表示你重定向的目录。
::: alertwarning
在你使用任何依赖于插件的功能(比如:$route或者useRouter)之前,确保检查下。因为当一个插件抛出错误时,如何你不调用clearError那此插件将不会再执行。
:::
示例:

<!-- error.vue -->
<template>
  <button @click="handleError">Clear errors</button>
</template>

<script setup>
const props = defineProps({
  error: Object
})

const handleError = () => clearError({ redirect: '/' })
</script>

错误相关的帮助函数

useError

function useError (): Ref<Error | { url, statusCode, statusMessage, message, description, data }>
这个函数将返回一个正在处理的全局nuxt 错误。

createError

function createError (err: { cause, data, message, name, stack, statusCode, statusMessage, fatal }): Error
你可以使用这个方法来创建一个包含附加元信息的错误对象,此对象可以在vue和部分nitro中使用。

如果你使用createError抛出了一个错误:

  • 如果在服务端,这将会触发一个全屏的错误页,你可以调用clearError来清除此错误。
  • 如果在客户端,这将会抛出一个不太严重的错误来给你处理。如果你需要触发一个全屏的错误页,你可以设置fatal:true
    示例:
<!-- pages/movies/[slug].vue -->
<script setup>
const route = useRoute()
const { data } = await useFetch(`/api/movies/${route.params.slug}`)
if (!data.value) {
  throw createError({ statusCode: 404, statusMessage: 'Page Not Found' })
}
</script>

showError

function showError (err: string | Error | { statusCode, statusMessage }): Error
你可以在客户端的任何地方调用此函数。或者在中间件插件或者setup()函数中也可以调用。这将会触发一个全屏页。
推荐使用此方法,而不是使用throw createError

clearError

function clearError (options?: { redirect?: string }): Promise<void>
此函数会清除当前处理了的nuxt 错误。

在你的应用中渲染错误。

Nuxt3也提供了一个<NuxtErrorBondary>组件。这个组件允许你处理客户端的错误,而不是进入一个错误页面。
这个组件主要负责处理在它所包含的逻辑中出现的错误。在客户端,此组件会阻止错误传递到最上层,取而代之的是渲染#error插槽。

#error插槽会将接收到的错误放在prop中,(如果你设置了error = null,这将会触发默认插槽的重新渲染, 您需要确保首先完全解决错误,否则错误槽将再次呈现。)。

::: alertinfo
如果你跳转到其它路由,那这个错误将会被自动清除。
:::
示例:

<!-- page/index.vue -->
<template>
  <!-- some content -->
  <NuxtErrorBoundary @error="someErrorLogger">
    <!-- You use the default slot to render your content -->
    <template #error="{ error }">
      You can display the error locally here.
      <button @click="error = null">
        This will clear the error.
      </button>
    </template>
  </NuxtErrorBoundary>
</template>




版权声明:本文为凸然网站的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:nuxt3中出错时的常用处理方式

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容