fix(web): 后端不可用统一用 BackendDownNotice 替代 404/手搓提示

This commit is contained in:
Yaojia Wang
2026-06-29 16:52:43 +02:00
parent f8cabc92e6
commit 47eb42f274
6 changed files with 52 additions and 26 deletions

View File

@@ -1,7 +1,9 @@
import { notFound } from "next/navigation";
import { BackendDownNotice } from "@/components/BackendDownNotice";
import { OutlineEditor } from "@/components/outline/OutlineEditor";
import { fetchOutline, fetchProject } from "@/lib/api/server";
import type { ProjectResponse } from "@/lib/api/types";
interface PageProps {
params: Promise<{ id: string }>;
@@ -12,13 +14,22 @@ interface PageProps {
// 仍按需触发 POST .../outline 生成/覆盖所显章节。
export default async function OutlinePage({ params }: PageProps) {
const { id } = await params;
// 仅当项目确实不存在404才判 notFound后端不可用等其它失败降级为「后端不可达」提示
// 不把整页变成「找不到页面」。次级拉取(大纲)的瞬时错误已在 fetchOutline 内降级为空。
let project: ProjectResponse;
try {
const project = await fetchProject(id);
const initialChapters = await fetchOutline(id);
return (
<OutlineEditor project={project} initialChapters={initialChapters} />
);
} catch {
notFound();
project = await fetchProject(id);
} catch (err) {
if (isNotFoundError(err)) notFound();
return <BackendDownNotice className="m-6" />;
}
const initialChapters = await fetchOutline(id);
return <OutlineEditor project={project} initialChapters={initialChapters} />;
}
// fetchProject 抛错信息形如「请求失败 404: ...」;据此区分「项目不存在」与「后端不可用」。
function isNotFoundError(err: unknown): boolean {
return err instanceof Error && err.message.includes("请求失败 404");
}