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

RSC/Next.js是否保证表单提交时Server Action能收到FormData?

关于Next.js Server Action中是否需要校验FormData类型的疑问

我正在研读新版Next.js文档,学习React Server Components(RSC)与Server Action相关内容。在官方文档的验证章节中,官方展示了使用Zod校验FormData值的示例,但我疑惑是否需要先校验接收的内容是否为FormData?

例如官方给出的Server Action示例:

export default async function createUser(formData: FormData) {
  const validatedFields = schema.safeParse({
    email: formData.get('email'),
  })
  // ...
}

客户端是否可通过篡改请求替换表单数据来导致服务器崩溃?若可以,校验FormData的合适方式是什么?比如像这样:

export default async function createUser(formData: FormData) {
  if (!(formData instanceof FormData)) return 'Invalid request'

  const validatedFields = schema.safeParse({
    email: formData.get('email'),
  })
  // ...
}

解答

1. 客户端篡改请求的可能性

是的,客户端完全可以通过篡改请求(比如直接发送非FormData格式的POST请求)绕过前端表单逻辑,向Server Action发送不符合预期的数据。如果不对参数类型做校验,当调用formData.get()方法时,若传入的并非FormData实例,会直接抛出TypeError,导致请求处理失败甚至服务器崩溃。

2. 是否需要校验FormData类型

非常有必要。TypeScript的类型标注仅在编译阶段生效,运行时没有类型检查。即便给参数标注了FormData类型,运行时依然可能接收到其他类型的数据,此时调用FormData专属方法必然出错。

3. 合适的校验方式

你给出的instanceof校验方式是可行的,还可以进一步完善逻辑:

  • 校验不通过时返回明确的结构化错误信息,方便前端统一处理;
  • 结合Zod的字段校验,确保内容格式也符合业务要求。

优化后的示例:

export default async function createUser(formData: unknown) {
  // 先校验请求数据类型
  if (!(formData instanceof FormData)) {
    return { success: false, error: '无效的请求格式' };
  }

  // 再校验字段内容合法性
  const validatedFields = schema.safeParse({
    email: formData.get('email'),
  });

  if (!validatedFields.success) {
    return { success: false, error: validatedFields.error.issues };
  }

  // 执行后续业务逻辑
  // ...
  return { success: true };
}

另外,也可以结合Zod直接对FormData的提取逻辑做封装:

import { z } from 'zod';

const formSchema = z.object({
  email: z.string().email(),
});

export default async function createUser(formData: unknown) {
  if (!(formData instanceof FormData)) {
    return { success: false, error: '无效的请求格式' };
  }

  const result = formSchema.safeParse({
    email: formData.get('email'),
  });

  if (!result.success) {
    return { success: false, error: result.error.issues };
  }

  // 业务逻辑处理
}

内容的提问来源于stack exchange,提问作者Martin Kadlec

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 06:12:10