You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用generateMetadata时,仅在该函数中处理notFound重定向可行吗?

Next.js中generateMetadata与Page组件的404处理问题

核心结论

你需要在**generateMetadata和Page组件中都处理404错误**,不过因为你用了React的cache包裹数据请求,不会产生重复的网络请求,只是多一层错误捕获而已。

原因分析

  1. 只处理Page组件的问题:
    当你仅在Page组件中捕获NotFoundError并调用notFound()时,generateMetadata函数执行时会直接抛出未被捕获的NotFoundError,Next.js会将这个未处理的错误判定为通用服务器错误,从而跳转到通用错误页,而非预期的404页面。

  2. 只处理generateMetadata的“表面正常”:
    当你仅在generateMetadata中处理错误时,一旦调用notFound(),Next.js会直接终止整个页面的渲染流程,Page组件根本不会执行,所以不会暴露错误。但这只是当前执行逻辑下的结果,存在边缘场景风险——比如缓存失效后、或者未来Next.js调整执行顺序时,Page组件可能在generateMetadata之前执行,这时候未处理的错误就会导致通用错误页。

优化后的代码示例

在Page组件中添加同样的错误捕获逻辑:

export default async function Page({ params: { username } }: PageProps) {
    try {
        const user = await getUser(username);
        return <UserProfilePage user={user} />;
    } catch (error) {
        if (error instanceof NotFoundError) {
            notFound();
        } else {
            throw error;
        }
    }
}

额外说明

因为你用了cache包裹getUser函数,两次调用只会发起一次网络请求,添加错误捕获不会带来性能损耗,却能让页面在任何执行路径下都能正确返回404页面,避免意外的通用错误。

内容的提问来源于stack exchange,提问作者Florian Walther

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:32:13