如何在 Next.js 中正确将表单数据传递到 API 路由

9次阅读

如何在 Next.js 中正确将表单数据传递到 API 路由

在 next.js 中,客户端组件无法通过 `export/import` 直接向服务端 api 路由共享状态;必须通过 http 请求(如 `fetch` post)发送数据,服务端再从 `req.body` 解析——这是前后端分离架构的基本约束。

为什么 export let formData 在 API 中无效?

根本原因在于执行环境隔离

  • FormComponent 运行在浏览器(客户端),其 formData 是内存中的 javaScript 变量;
  • /api/endpoint 是服务端 node.js 函数(API Route),启动时独立于任何前端组件,也无法访问客户端内存。
    因此,import { formData } from ‘./FormComponent’ 在服务端会得到 undefined ——它导入的是模块顶层声明的初始空对象,而非用户提交后的动态值。

✅ 正确做法:用 fetch 发起 POST 请求

修改表单组件,移除全局可变 export let formData,改用受控组件 + fetch 显式提交:

// components/FormComponent.tsx import { useState } from 'react';  const FormComponent = () => {   const [formData, setFormData] = useState({     name: '',     email: '',     message: '',   });    const handleChange = (e: react.ChangeEvent) => {     setFormData(prev => ({       ...prev,       [e.target.name]: e.target.value,     }));   };    const handleSubmit = async (e: React.FormEvent) => {     e.preventDefault();      try {       const res = await fetch('/api/submit', {         method: 'POST',         headers: { 'Content-Type': 'application/json' },         body: JSON.stringify(formData),       });        if (!res.ok) throw new Error(`HTTP ${res.status}`);       const result = await res.json();       console.log('Submission successful:', result);       alert('Message sent!');     } catch (err) {       console.error('Submission failed:', err);       alert('Failed to send. Please try again.');     }   };    return (