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

Next.js App Router客户端向POST路由传参时body解构为undefined问题

问题解决:Next.js App Router中POST请求body获取undefined

核心原因

在Next.js App Router的API路由中,request是标准的Web Request对象,无法直接通过request.body访问请求体,必须先调用request.json()(或对应解析方法如formData())解析请求内容。你的代码遗漏了解析步骤,导致解构时返回undefined。

修正后的服务端路由代码

import { NextResponse } from "next/server";

export async function GET() {
  const res = await fetch("https://jsonplaceholder.typicode.com/posts");
  const data = await res.json();
  const post = data.slice(0, 5);

  return NextResponse.json({ data: post });
}

export async function POST(request) {
  // 先解析请求体
  const { title, body, userId } = await request.json();
  console.log({ title, body, userId });

  const fetchResponse = await fetch("https://jsonplaceholder.typicode.com/posts", {
    method: "POST",
    headers: {
      "Content-type": "application/json; charset=UTF-8",
    },
    body: JSON.stringify({ title, body, userId }),
  });

  const data = await fetchResponse.json();
  console.log(data);
  return NextResponse.json(data);
}

客户端组件的优化建议(可选)

你当前混合使用了async/await和.then(),可以统一代码风格并添加错误捕获,提升可读性和健壮性:

"use client";

import { useState } from "react";

const Postapost = () => {
  const [title, setTitle] = useState("");
  const [body, setBody] = useState("");

  const handlePost = async () => {
    const userId = 1;
    const fullPost = { title, body, userId };
    console.log(fullPost);

    try {
      const response = await fetch("http://localhost:3000/api", {
        method: "POST",
        headers: {
          "Content-type": "application/json; charset=UTF-8",
        },
        body: JSON.stringify(fullPost),
      });
      const json = await response.json();
      console.log(json);
    } catch (error) {
      console.error("请求失败:", error);
    }
  };

  return (
    <div>
      <input
        type="text"
        name="title"
        onChange={(e) => setTitle(e.target.value)}
      />
      <input
        type="text"
        name="body"
        onChange={(e) => setBody(e.target.value)}
      />
      <button onClick={handlePost}>add post</button>
    </div>
  );
};

export default Postapost;

关键修改点总结

  • 服务端POST路由添加await request.json()解析请求体
  • 移除服务端POST函数中未使用的response参数
  • 客户端组件统一使用async/await并添加错误捕获(可选)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 03:07:39