0

0

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

霞舞

霞舞

发布时间:2026-01-31 19:49:18

|

199人浏览过

|

来源于php中文网

原创

如何在 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 (