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

如何为Next.js的API端点配置JSON格式的自定义错误响应?

在Next.js的API路由中返回自定义JSON错误响应

单个API路由手动处理错误

针对特定API端点,直接在处理函数里捕获错误或判断资源状态,返回JSON格式的响应即可。

示例(pages/api/posts/[id].js):

export default function handler(req, res) {
  const { id } = req.query;

  try {
    // 模拟获取数据的逻辑
    const post = getPostById(id);
    if (!post) {
      return res.status(404).json({
        error: "指定的文章不存在",
        statusCode: 404
      });
    }
    res.status(200).json(post);
  } catch (err) {
    // 生产环境可以隐藏具体错误信息,避免泄露敏感内容
    const errorMsg = process.env.NODE_ENV === "production" 
      ? "服务器内部错误" 
      : err.message;
    
    res.status(500).json({
      error: errorMsg,
      statusCode: 500
    });
  }
}

全局统一处理API错误(Pages Router)

如果不想每个API都重复写错误逻辑,可以封装一个错误处理中间件,批量应用到所有API路由。

步骤1:创建错误处理中间件

新建utils/apiErrorHandler.js:

export default function apiErrorHandler(handler) {
  return async (req, res) => {
    try {
      await handler(req, res);
      // 如果未发送响应,说明请求的资源不存在
      if (!res.headersSent) {
        res.status(404).json({
          error: "API端点不存在",
          statusCode: 404
        });
      }
    } catch (err) {
      const errorMsg = process.env.NODE_ENV === "production"
        ? "服务器内部错误"
        : err.message;
      
      res.status(500).json({
        error: errorMsg,
        statusCode: 500
      });
    }
  };
}

步骤2:在API路由中使用中间件

import apiErrorHandler from "../../utils/apiErrorHandler";

const handler = async (req, res) => {
  // 你的API业务逻辑
  const data = await fetchSomeData();
  res.status(200).json(data);
};

export default apiErrorHandler(handler);

处理未定义的API端点(全局404 JSON响应)

如果用户访问了不存在的API路径(比如/api/non-existent),Next.js默认会返回HTML格式的404,这可以通过Next.js中间件拦截并转换成JSON响应。

新建middleware.js:

import { NextResponse } from "next/server";

export async function middleware(request) {
  // 只处理API路由的请求
  if (request.nextUrl.pathname.startsWith("/api/")) {
    const response = await NextResponse.next();
    
    // 拦截HTML格式的404/500响应,转为JSON
    if (
      (response.status === 404 || response.status === 500) &&
      response.headers.get("content-type")?.includes("text/html")
    ) {
      const errorMsg = response.status === 404 
        ? "API端点不存在" 
        : "服务器内部错误";
      
      return new Response(JSON.stringify({
        error: errorMsg,
        statusCode: response.status
      }), {
        status: response.status,
        headers: { "Content-Type": "application/json" }
      });
    }
    return response;
  }
  return NextResponse.next();
}

Next.js 13+ App Router 方案

如果使用App Router的API路由(app/api/.../route.js),可以直接用NextResponse返回自定义JSON错误:

import { NextResponse } from "next/server";

export async function GET(request) {
  const { searchParams } = new URL(request.url);
  const id = searchParams.get("id");
  
  if (!id) {
    return NextResponse.json(
      { error: "缺少必要的ID参数", statusCode: 400 },
      { status: 400 }
    );
  }

  try {
    const item = await getItemById(id);
    if (!item) {
      return NextResponse.json(
        { error: "指定资源不存在", statusCode: 404 },
        { status: 404 }
      );
    }
    return NextResponse.json(item);
  } catch (err) {
    const errorMsg = process.env.NODE_ENV === "production"
      ? "服务器内部错误"
      : err.message;
    
    return NextResponse.json(
      { error: errorMsg, statusCode: 500 },
      { status: 500 }
    );
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:47:40