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

Next.js中使用Formik与Yup时表单数据无法传递至API端点,服务器端获取值为undefined的问题

Next.js中使用Formik与Yup时表单数据无法传递至API端点,服务器端获取值为undefined的问题

嗨,我来帮你排查这个问题!你遇到的这种客户端能看到表单数据,但服务器端拿不到、请求体为空且bodyUsed为false的情况,通常是请求发送格式或者服务器端处理逻辑的小疏漏,咱们一步步来解决:

一、先检查客户端的请求发送逻辑

从你给出的代码片段来看,Formik的onSubmit方法里应该是要发送请求到API端点,但大概率是没正确处理请求体的序列化和请求头设置。正确的写法应该是这样的:

onSubmit: async (values) => {
  try {
    setLoading(true);
    // 发送POST请求到你的API端点
    const response = await fetch('/api/contact', {
      method: 'POST',
      // 必须设置这个请求头,告诉服务器我们发送的是JSON格式数据
      headers: {
        'Content-Type': 'application/json',
      },
      // 把Formik的values对象序列化成JSON字符串
      body: JSON.stringify(values),
    });

    // 这里可以根据响应结果做后续处理,比如提示成功
    if (response.ok) {
      setProcessed(true);
    }
  } catch (error) {
    console.error('提交失败:', error);
  } finally {
    setLoading(false);
  }
}

如果没设置Content-Type或者没序列化数据,服务器端就无法正确解析请求体,自然会拿到undefined,同时因为请求体没被读取过,bodyUsed会保持false。

二、检查服务器端API路由的处理逻辑

不管你用的是Next.js的App Router还是Pages Router,都需要正确读取请求体:

如果你用的是App Router(比如app/api/contact/route.js):

export async function POST(request) {
  // 必须用await来读取请求体,这里是JSON格式
  const formData = await request.json();
  console.log('服务器端收到的表单数据:', formData);
  
  // 这里写你的业务逻辑,比如存入数据库、发送邮件等
  return new Response(JSON.stringify({ message: '表单提交成功' }), {
    status: 200,
    headers: { 'Content-Type': 'application/json' },
  });
}

如果你用的是Pages Router(比如pages/api/contact.js):

export default async function handler(req, res) {
  if (req.method === 'POST') {
    // Pages Router里req.body会自动解析,但前提是客户端发送的是正确的JSON格式
    console.log('服务器端收到的表单数据:', req.body);
    
    // 业务逻辑处理
    res.status(200).json({ message: '表单提交成功' });
  } else {
    res.status(405).json({ message: '只支持POST请求' });
  }
}

注意:在App Router中,request.json()只能调用一次,如果你之前调用过request.text()或其他读取方法,bodyUsed会变成true,但如果完全没调用,请求体就会是空的。

三、排除其他可能的小问题

  • 确认API端点的路径是否正确:客户端fetch的路径要和服务器端路由的路径完全一致,别出现拼写错误或者路径层级错误。
  • 如果你表单里有文件上传,那不能用JSON格式,得用FormData来传递,但看你的initialValues都是文本字段,所以用JSON就没问题。
  • 检查是否有跨域问题:如果你的API是部署在外部域名,需要配置CORS,但如果是Next.js同域的API路由,这一步可以忽略。

按照上面的步骤检查调整后,应该就能解决服务器端拿不到表单数据的问题啦!

备注:内容来源于stack exchange,提问作者medOnline5

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 10:50:33