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

如何在Next.js 13 Server Actions中返回自定义HTTP状态码?

在Next.js 13 Server Actions中返回带特定HTTP状态码的JSON响应

Next.js 13的Server Actions支持两种核心方式返回带自定义HTTP状态码的JSON响应,根据使用场景选择即可:

1. 手动构造带状态码的响应(推荐用于自定义成功/错误场景)

通过NextResponse.json()可以直接生成包含指定状态码的JSON响应,适用于需要明确返回业务状态的场景,比如成功返回200、参数错误返回400等。

示例代码:

'use server';

import { NextResponse } from 'next/server';

export async function fetchExternalData() {
  try {
    // 模拟调用外部接口或读取数据库数据
    const externalData = await fetch('https://api.example.com/data')
      .then(res => {
        if (!res.ok) throw new Error('外部接口请求失败');
        return res.json();
      });

    // 返回带200状态码的成功响应
    return NextResponse.json(
      { success: true, data: externalData },
      { status: 200 }
    );
  } catch (err) {
    // 返回带400状态码的错误响应
    return NextResponse.json(
      { success: false, message: err instanceof Error ? err.message : '未知错误' },
      { status: 400 }
    );
  }
}

2. 抛出内置错误触发状态码(适用于标准HTTP错误场景)

Next.js提供了notFound()、internalServerError()等内置方法,调用这些方法会自动返回对应的HTTP状态码,同时触发框架的错误处理逻辑(比如显示自定义错误页面)。

示例代码:

'use server';

import { notFound, internalServerError } from 'next/navigation';

export async function fetchItemById(itemId: string) {
  const response = await fetch(`https://api.example.com/items/${itemId}`);

  if (response.status === 404) {
    // 触发404状态码响应
    notFound();
  }

  if (!response.ok) {
    // 触发500状态码响应
    internalServerError();
  }

  const item = await response.json();
  return item;
}

客户端调用与状态码处理

在客户端组件中,可以通过useActionState捕获Server Actions返回的响应,获取状态码和JSON数据:

'use client';

import { useActionState } from 'react';
import { fetchExternalData } from '@/actions';

export default function DataPage() {
  const [actionResponse, formAction] = useActionState(fetchExternalData, null);

  return (
    <div>
      <form action={formAction}>
        <button type="submit">获取数据</button>
      </form>
      {actionResponse && (
        <div className="mt-4">
          <h3>响应状态码: {actionResponse.status}</h3>
          <pre className="mt-2 p-2 bg-gray-100">
            {JSON.stringify(await actionResponse.json(), null, 2)}
          </pre>
        </div>
      )}
    </div>
  );
}

注意:如果Server Actions是通过直接函数调用(而非表单action)触发,同样可以获取到返回的NextResponse对象,通过response.status和response.json()处理结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:05:15