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

Next.js 14中如何返回带403状态码的错误页面

解决Next.js 14中展示403权限错误页面的问题

直接抛出普通Error会被Next.js判定为服务器内部错误(返回500状态码),要返回符合预期的403状态码并展示对应错误页面,你可以按以下两种方式处理:

方法一:使用Next.js内置的unauthorized()助手函数

Next.js App Router提供了专门的权限错误处理函数,调用它会自动触发403状态码,并渲染你的error.js页面:

import { unauthorized } from 'next/navigation';
import { getServerSession } from 'next-auth/next';

const EditPost = async () => {
  const session = await getServerSession();

  // 注意:请确认notAuthorised函数的逻辑是否正确,通常该函数返回true表示用户未授权,此时条件应为if (notAuthorised(session))
  if (!notAuthorised(session)) {
    unauthorized(); // 触发403权限错误
  }

  // 正常渲染编辑页面内容
  return <div>编辑文章内容</div>;
};

export default EditPost;

方法二:自定义带状态码的错误对象

如果你需要自定义错误提示信息,可以手动创建带有statusCode属性的错误并抛出,Next.js会识别该状态码并返回对应响应:

import { getServerSession } from 'next-auth/next';

const EditPost = async () => {
  const session = await getServerSession();

  // 注意:请确认notAuthorised函数的逻辑是否正确
  if (!notAuthorised(session)) {
    const authError = new Error('无权限编辑该文章');
    authError.statusCode = 403;
    throw authError;
  }

  // 正常渲染编辑页面内容
  return <div>编辑文章内容</div>;
};

export default EditPost;

优化你的error.js页面

error.js需要是客户端组件(添加'use client';指令),并根据错误状态码展示对应内容:

'use client';

const BlogError = ({ error }) => {
  const statusCode = error.statusCode || 500;
  const errorTitle = statusCode === 403 ? '权限不足' : '发生错误';

  return (
    <div>
      <h1>{errorTitle}</h1>
      <p>{error.message || '未知错误'}</p>
    </div>
  );
};

export default BlogError;

这样处理后,未授权用户访问时,页面会返回403状态码,并展示对应的权限错误提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 17:42:09