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

Next.js 13中如何接收URL编码的表单数据?

在Next.js 13中处理URL编码的表单提交数据

一、通过App Router路由处理函数接收表单数据

在Next.js 13的App Router模式下,你需要在项目的app/submit目录下创建route.ts文件,专门处理/submit路径的POST请求:

import { NextRequest, NextResponse } from 'next/server';

export async function POST(request: NextRequest) {
  // 解析URL编码的表单数据
  const formData = await request.formData();
  
  // 获取表单字段值
  const username = formData.get('username') as string;
  const password = formData.get('password') as string;

  // 此处添加你的业务逻辑,比如字段验证、数据存储等
  console.log('提交的用户名:', username);
  console.log('提交的密码:', password);

  // 返回响应,示例为重定向到成功页面
  return NextResponse.redirect(new URL('/success', request.url));
  // 若需返回JSON数据,可使用:return NextResponse.json({ username, status: 'success' });
}

二、在Middleware中处理表单数据的正确方式

你之前直接访问req.body无法获取数据,是因为NextRequest的body是未解析的ReadableStream,必须手动调用解析方法处理URL编码的表单数据:

import { NextRequest, NextResponse } from 'next/server';

export async function middleware(request: NextRequest) {
  // 仅匹配POST请求和/submit路径
  if (request.method === 'POST' && request.nextUrl.pathname === '/submit') {
    // 解析表单数据
    const formData = await request.formData();
    const username = formData.get('username') as string;
    const password = formData.get('password') as string;

    // 示例:添加前置验证逻辑
    if (!username || !password) {
      return NextResponse.json({ error: '用户名和密码不能为空' }, { status: 400 });
    }
  }

  // 继续执行后续路由逻辑
  return NextResponse.next();
}

// 指定中间件匹配的路径规则
export const config = {
  matcher: '/submit',
};

三、关键说明

  • 无需额外配置:Next.js 13默认支持处理application/x-www-form-urlencoded格式的表单数据,直接使用request.formData()解析即可。
  • formData()方法:该方法自动兼容URL编码和多部分表单(multipart/form-data)两种格式,适配你的表单场景。
  • 类型处理:formData.get()返回值为FormDataEntryValue | null,建议先做非空判断,再断言为字符串类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 16:03:28