首页
Preview

Nuxt 3 自定义错误页面(包括 404 页面)指南

Nuxt 3 提供了许多开箱即用的功能,其中包括默认的错误页面。不过,尽管默认错误页面很好用,通常我们更希望创建属于自己的自定义错误页面。

本文将详细讲解如何编写自定义错误页面,根据错误代码进行定制,并在发生错误时优雅地恢复应用的正常状态。

创建自定义错误页面

在 Nuxt 3 中,要创建一个错误页面,我们需要在项目根目录(与 app.vue 文件同级)添加一个 error.vue 文件。

首先我们来了解一下这个error.vue 页面,它不是一个普通的页面,在Nuxt项目中error.vue 文件有一定的特殊性:

  1. 错误页面独立于路由系统

    • 在 Nuxt 中,普通页面是通过 pages 目录定义的,它们会自动映射到 Vue Router 的路由规则中。
    • 然而,error.vue 并不是通过路由系统加载的。它是 Nuxt 内部直接处理错误状态时显示的页面,而不是依赖 Vue Router 来显示。
  2. 并非所有 Nuxt 应用都使用 Vue Router

    • 有些 Nuxt 应用可能没有页面(比如纯后端渲染的 API 或者某些微服务)。
    • 在这种情况下,应用可能没有用到 Vue Router,但错误页面仍然需要被支持,因此 error.vue 是 Nuxt 的内置机制,而不是通过 Vue Router 渲染的普通页面。
  3. 适用于服务端和客户端的错误

    • error.vue 页面既可以用于处理服务端错误(例如服务器渲染失败),也可以用于客户端的运行时错误。
    • 这种设计保证了无论应用是否使用 Vue Router,都能有一个统一的错误处理页面。

接下来写一个简单的 error.vue 示例:

<template>
  <NuxtLayout>
    <div>
      <h1>糟糕!</h1>
       <p><strong>{{ error.message }}</strong></p>
      <p>看起来发生了一些错误。</p>
      <p>非常抱歉。</p>
    </div>
  </NuxtLayout>
</template>

<script setup>
// 可以通过 useError 获取错误的详细信息
const error = useError();
</script>

全局错误 vs 客户端错误

在 Nuxt3 中,错误可以分为两类:

  • 全局错误(Global Errors): 这些错误通常是“服务端错误”,但仍然可以通过客户端访问,例如 API 调用失败或服务端渲染出错时发生。

  • 客户端错误(Client-side Errors): 这些错误仅存在于客户端,与应用的其他部分无关。比如交互操作或路由切换时的错误。

注意:NuxtErrorBoundary 仅处理客户端错误。 全局错误需要使用其他方法单独处理。

清除错误并恢复

当应用发生错误时,我们需要一种机制来从错误中恢复。例如,可以通过 clearError 方法清除全局错误并导航到其他页面:

<script setup>
const error = useError();

const handleError = () => {
  clearError({
    redirect: '/home', // 清除错误并跳转到首页
  });
};
</script>

<template>
  <NuxtLayout>
    <div class="prose">
      <h1>糟糕!</h1>
      <p><strong>{{ error.message }}</strong></p>
      <p>看起来发生了一些错误。</p>
      <p>非常抱歉。</p>
      <p>
        返回 <a @click="handleError">仪表盘</a>
      </p>
    </div>
  </NuxtLayout>
</template>

当用户点击链接时,错误将被清除,并跳转到 /home

自定义 404 页面

默认情况下,Nuxt 的错误页面只会显示传入的错误信息。如果我们希望针对 404 错误显示完全不同的页面,可以通过检查 error.statusCode 实现。

通过 useError 获取的错误对象包含以下结构:

error = {
  statusCode: Number,   // 错误代码
  statusMessage: String, // 状态信息
  message: String       // 错误详情
}

接着我们根据状态在error.vue页面,加上404的判断,具体代码如下:

<template>
  <NuxtLayout>
    <div class="prose">
      <template v-if="error.statusCode === 404">
        <h1>404 页面不存在</h1>
        <p>抱歉,您访问的页面不存在。</p>
      </template>
      <template v-else>
        <h1>糟糕!</h1>
        <p><strong>{{ error.message }}</strong></p>
        <p>看起来发生了一些错误。</p>
        <p>非常抱歉。</p>
      </template>
      <p>
        返回 <a @click="handleError">回到首页</a>
      </p>
    </div>
  </NuxtLayout>
</template>

<script setup>
const error = useError();

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

总结

Nuxt 3 提供了灵活的错误处理机制,让我们可以: 创建自定义错误页面; 根据错误代码动态调整页面内容; 优雅地清除错误并帮助用户恢复到应用的正常状态。

更多信息可参考 Nuxt 官方文档 的错误处理https://nuxt.com.cn/docs/getting-started/error-handling部分。

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
Hedy
大家好!我是一位前端开发工程师,拥有6年以上的前端开发经验。我熟练掌握HTML、CSS、JavaScript等语言,能够灵活运用各种前端框架,如Vue、React、Uniapp、Flutter等。我注重理论与实践相结合,能够为学员提供丰富的案例和实践项目,并以生动、易懂的语言为学员讲解前端开发的核心知识和技能。我不仅注重传授技能,更关注学员的职业发展,希望通过我的教学,帮助学员成为一名优秀的前端开发工程师。

评论(0)

添加评论