news 2026/7/7 20:11:03

【Svelte】404页面的两种处理方式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Svelte】404页面的两种处理方式

在 SvelteKit 中,routes/[...404]/+page.svelte这个页面是用来处理未匹配到的路由(即用户访问了一个在你的routes目录下没有定义的文件路径)。

如果你想在一个已经匹配到的路由(例如routes/product/[id]/+page.server.ts)中,根据业务逻辑(比如商品不存在)来显示这个 404 页面的内容,你需要利用 SvelteKit 的错误处理机制。

核心思想是:

  1. 在一个+page.server.ts+page.ts文件中,当业务逻辑判断需要显示 404 时,抛出 SvelteKit 提供的error(404, 'Not Found')
  2. SvelteKit 会捕获这个错误,并寻找routes/+error.svelte文件来渲染错误页面。
  3. routes/+error.svelte文件中,你可以根据$page.status(从$app/stores导入)来判断是否为 404 错误,如果是,就导入并渲染你的routes/[...404]/+page.svelte组件。

下面是详细的步骤和代码示例:


1. 你的 404 页面(routes/[...404]/+page.svelte

这个页面保持不变,它包含了你自定义的 404 错误内容。

<!-- src/routes/[...404]/+page.svelte --> <div class="not-found-container"> <h1>404 - 页面未找到</h1> <p>抱歉,您要查找的页面不存在。</p> <p>您可能想尝试搜索,或者返回<a href="/">主页</a>。</p> <!-- 你可以在这里添加更多内容,比如搜索框、最近文章等 --> </div> <style> .not-found-container { text-align: center; padding: 50px; background-color: #f8f8f8; border-radius: 8px; margin: 50px auto; max-width: 600px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); } h1 { color: #e44d26; /* Svelte logo color */ font-size: 3em; margin-bottom: 20px; } p { font-size: 1.2em; color: #555; margin-bottom: 10px; } a { color: #e44d26; text-decoration: underline; } </style>

2. 创建或修改全局错误页面(routes/+error.svelte

这个文件是关键,它会捕获所有由throw error(...)抛出的错误,并根据错误状态码来渲染不同的内容。

<!-- src/routes/+error.svelte --> <script lang="ts"> import { page } from '$app/stores'; // 导入你的特定 404 页面组件 // 注意:这里的路径是相对于当前 +error.svelte 文件的路径 // 如果你的 +error.svelte 在 src/routes/ 下, // 那么 [...]404 文件夹就在它的同级目录。 import NotFoundPage from './[...404]/+page.svelte'; </script> {#if $page.status === 404} <!-- 如果是 404 错误,渲染你自定义的 404 页面组件 --> <NotFoundPage /> {:else} <!-- 对于其他类型的错误,显示一个通用错误页面 --> <div class="error-container"> <h1>错误 {$page.status}</h1> <p>{$page.error?.message || '发生了一个未知错误。'}</p> <a href="/">返回主页</a> </div> {/if} <style> .error-container { text-align: center; padding: 50px; background-color: #fefefe; border-radius: 8px; margin: 50px auto; max-width: 600px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); } </style>

3. 在你的 TS 文件中抛出 404 错误

现在,在任何需要根据业务逻辑显示 404 的+page.server.ts(或+page.ts)文件中,你可以抛出 404 错误。

例如,假设你有一个routes/product/[id]/+page.server.ts文件,你需要根据id从数据库加载产品,如果产品不存在,就显示 404。

// src/routes/product/[id]/+page.server.tsimport{error}from'@sveltejs/kit';importtype{PageServerLoad}from'./$types';exportconstload:PageServerLoad=async({params})=>{constproductId=params.id;// 模拟从数据库获取产品数据constproduct=awaitgetProductFromDatabase(productId);if(!product){// 如果产品不存在,抛出 404 错误// SvelteKit 会捕获此错误并渲染 src/routes/+error.sveltethrowerror(404,'产品未找到');}// 如果产品存在,正常返回数据return{product:product};};// 模拟数据库函数asyncfunctiongetProductFromDatabase(id:string){// 假设 'non-existent' 是一个不存在的 IDif(id==='non-existent'){returnnull;}// 模拟异步返回产品数据return{id,name:`产品${id}`,price:99.99};}

工作原理总结:

  1. 当用户访问http://localhost:5173/product/non-existent时。
  2. SvelteKit 会匹配到src/routes/product/[id]/+page.server.ts
  3. load函数中,getProductFromDatabase('non-existent')返回null
  4. if (!product)条件为真,throw error(404, '产品未找到')被执行。
  5. SvelteKit 捕获到这个错误,并跳转到src/routes/+error.svelte页面。
  6. src/routes/+error.svelte中,$page.status的值为404
  7. {#if $page.status === 404}条件为真,它会渲染你导入的NotFoundPage组件。
  8. 最终,用户在浏览器中看到的是src/routes/[...404]/+page.svelte的内容,但 URL 仍然保持为/product/non-existent

这种方法是最符合 SvelteKit 哲学的方式,它分离了路由匹配、业务逻辑和错误呈现。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/7 12:38:52

【收藏】Java 程序员转行 AI 大模型:从零起步的就业指南与实战技巧

在人工智能技术全面爆发的当下&#xff0c;从Java这类传统编程领域切入AI大模型开发&#xff0c;是一场兼具挑战与潜力的职业跃迁。对于深耕Java技术栈的程序员而言&#xff0c;这不仅是突破职业瓶颈的契机&#xff0c;更是实现薪资跃升、拓展技术边界的绝佳路径。一、先搞懂&a…

作者头像 李华
网站建设 2026/7/7 19:00:10

GraphRAG深度解析:超越传统RAG的智能检索技术,建议收藏学习

GraphRAG是微软开源的结构化、分层RAG方法&#xff0c;通过构建实体知识图和社区摘要&#xff0c;有效处理全局性问题。它结合知识图谱的"节点-边-节点"结构与文本信息&#xff0c;通过索引&#xff08;文本分块、图提取、社区检测、摘要生成&#xff09;和查询&…

作者头像 李华
网站建设 2026/7/7 12:12:01

基于SpringBoot的校园新闻发布平台

基于SpringBoot的校园新闻发布平台设计与实现 第一章 系统开发背景与现实意义 当前校园新闻传播存在诸多痛点&#xff1a;传统新闻依赖校园官网、宣传栏等渠道&#xff0c;更新滞后且覆盖范围有限&#xff1b;不同部门&#xff08;教务处、学生处、院系&#xff09;的新闻分散发…

作者头像 李华
网站建设 2026/7/7 16:00:53

如何在本地运行LobeChat?完整Docker部署教程来了

如何在本地运行 LobeChat&#xff1f;完整 Docker 部署指南 你有没有想过&#xff0c;自己也能拥有一套不依赖 OpenAI、数据完全可控的 AI 聊天系统&#xff1f;尤其是在处理敏感信息时&#xff0c;把对话内容传到第三方 API 总让人心里打鼓。延迟高、费用不可控、模型切换麻烦…

作者头像 李华
网站建设 2026/7/7 8:58:53

快速上手LobeChat:新手也能30分钟完成部署上线

快速上手LobeChat&#xff1a;新手也能30分钟完成部署上线 在AI对话系统日益普及的今天&#xff0c;一个现实问题摆在许多开发者面前&#xff1a;明明已经接入了强大的大语言模型&#xff0c;却苦于没有像样的交互界面。手动调API太原始&#xff0c;自研前端又耗时耗力——有没…

作者头像 李华
网站建设 2026/7/7 12:24:32

29、实用 awk 程序大揭秘

实用 awk 程序大揭秘 1. 大文件分割程序 在处理大文件时,将其分割成小文件是常见需求。 split 程序就能实现这一功能,其使用方法如下: split [-count] [file] [prefix]默认情况下,输出文件名为 xaa 、 xab 等,每个文件包含 1000 行(最后一个文件可能除外)。若要…

作者头像 李华