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

NextJS纯API模式下如何自定义404错误返回JSON响应

在纯API模式下自定义NextJS错误处理(返回JSON响应)

NextJS作为纯API服务时,默认的HTML错误页面不符合接口需求,以下分两种路由系统给出具体实现方案:

一、Pages Router 方案

1. 全局API错误捕获(推荐)

在pages/api目录下创建_error.js文件,该文件会捕获所有API路由的错误(包括404),返回自定义JSON响应:

export default function handler(err, req, res) {
  // 自定义错误状态码和响应结构
  const statusCode = err?.statusCode || res?.statusCode || 500;
  const errorResponse = {
    error: {
      message: err?.message || "服务器内部错误",
      code: err?.code || statusCode,
    },
  };

  res.status(statusCode).json(errorResponse);
}

2. 单个API路由内的错误处理

如果需要针对特定API路由做定制化处理,可在路由文件中用try-catch包裹业务逻辑:

export default function handler(req, res) {
  try {
    // 你的API业务逻辑
    if (!req.query.id) {
      throw new Error("缺少必要参数id");
    }
    res.status(200).json({ data: "请求成功" });
  } catch (err) {
    res.status(400).json({
      error: {
        message: err.message,
        code: 400,
      },
    });
  }
}

二、App Router 方案

1. Catch-All API路由处理404

在app/api目录下创建[...notFound]/route.js(命名可自定义),用于捕获所有未匹配的API请求,返回JSON格式404:

import { NextResponse } from "next/server";

export function GET() {
  return NextResponse.json(
    {
      error: {
        message: "请求的API路径不存在",
        code: 404,
      },
    },
    { status: 404 }
  );
}

// 覆盖其他请求方法(POST/PUT/DELETE等)
export function POST() {
  return GET();
}
export function PUT() {
  return GET();
}
export function DELETE() {
  return GET();
}

2. 全局API错误处理

利用App Router的中间件(middleware.js/middleware.ts)捕获API路由的错误,统一返回JSON:

import { NextResponse } from "next/server";

export function middleware(request) {
  try {
    // 可在此添加请求校验逻辑,或传递请求到下一个路由
    return NextResponse.next();
  } catch (err) {
    return NextResponse.json(
      {
        error: {
          message: err.message || "服务器内部错误",
          code: 500,
        },
      },
      { status: 500 }
    );
  }
}

// 指定仅对API路由生效
export const config = {
  matcher: "/api/:path*",
};

3. 单个API路由内的错误处理

在App Router的API路由文件中,用try-catch包裹逻辑,捕获错误后返回JSON:

import { NextResponse } from "next/server";

export async function GET(request) {
  try {
    const { searchParams } = new URL(request.url);
    const id = searchParams.get("id");
    if (!id) {
      throw new Error("参数id不能为空");
    }
    return NextResponse.json({ data: "请求成功" });
  } catch (err) {
    return NextResponse.json(
      {
        error: {
          message: err.message,
          code: 400,
        },
      },
      { status: 400 }
    );
  }
}

注意事项

  • 确保所有API请求都被路由规则覆盖,避免触发NextJS默认的HTML错误页面
  • 可根据业务需求自定义错误响应结构,比如添加type、trace_id等字段
  • 若使用TypeScript,只需将文件后缀改为.ts,补充对应类型定义即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 14:58:25