0

0

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

心靈之曲

心靈之曲

发布时间:2026-01-31 20:33:08

|

771人浏览过

|

来源于php中文网

原创

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

next.js 的表单组件运行在客户端,而 api 路由(如 `/api/endpoint`)运行在服务端,二者无法通过 `export/import` 共享变量。必须使用 http 请求(如 `fetch` + post)将表单数据序列化后发送至 api 端处理。

在 Next.js 应用中,常见的误区是试图通过模块导出(export let formData)让客户端状态“跨环境”被服务端 API 路由直接读取。这是根本不可行的:React 组件及其状态完全运行在浏览器中(客户端),而 pages/api/xxx.ts 或 app/api/xxx/route.ts 中的 API 处理函数运行在 Node.js 服务端,两者物理隔离、内存不共享、生命周期无关。

✅ 正确做法是:通过标准 HTTP 协议通信——在表单提交时,使用 fetch() 向 API 路由发起 POST 请求,并将表单数据以 JSON 格式作为请求体(body)发送。

以下是完整、可运行的实现方案:

✅ 客户端:优化后的 FormComponent

import { useState } from 'react';

const FormComponent = () => {
  const [formData, setFormData] = useState({
    name: '',
    email: '',
    message: '',
  });

  const handleChange = (e: React.ChangeEvent) => {
    const { name, value } = e.target;
    setFormData(prev => ({ ...prev, [name]: value }));
  };

  const handleSubmit = async (e: React.FormEvent) => {
    e.preventDefault();

    try {
      const res = await fetch('/api/contact', {
        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('✅ API response:', result);
      alert('Message sent successfully!');
    } catch (err) {
      console.error('❌ Submission failed:', err);
      alert('Failed to send. Please try again.');
    }
  };

  return (