新闻详情

新闻详情

首页 / 资讯中心 / 详情

Remix 3 表单数据怎么用 data-schema 校验并返回 400 响应

发布时间:2026/9/12 2:34:48来源:尧图网络
Remix 3 表单数据怎么用 data-schema 校验并返回 400 响应
Remix 3 表单数据怎么用 contenteditable="false">【免费下载链接】remixThe fully-stacked web framework项目地址: https://gitcode.com/GitHub_Trending/re/remixRemix 里一个常见的服务端表单处理需求浏览器把未经信任的字段 POST 到 action服务器要先校验这些字段字段不合法时把表单带着错误信息原样返回并置为400而不是直接进业务逻辑。这套流程由remix/data-schemaschema 与parseSafe、remix/data-schema/form-data面向表单的f.object/f.field、remix/data-schema/checks约束以及remix/middleware/form-data一次性解析 FormData几个包组合完成。本文以仓库里 social-auth 示例的注册signupaction 为参照给出从定义 schema 到验证400响应的完整路径。涉及的包与整体流程包作用remix/data-schemaschema 构建object、string等与parse/parseSaferemix/data-schema/form-data面向FormData/URLSearchParams的f.object、f.field、f.fields、f.file、f.filesremix/data-schema/checks约束minLength、maxLength、email、min、maxremix/data-schema/coerce把字符串字段转成 number / boolean / date / bigint 等remix/middleware/form-dataformData()中间件保证 FormData 只解析一次整体链路formData()中间件先把请求体解析成FormData放进 context → action 里用parseSafe(schema, formData)校验 → 失败就render(..., { status: 400 })把表单连同错误信息重新渲染。章节文档也明确建议在 action 里用parseSafe()当非法输入应该变成400响应时优先用它Data and Validation。参考实现signup 控制器、表单 schema、路由器与中间件。定义表单校验 schema用f.object建根 schema用f.field声明单个文本字段再用checks里的约束写具体规则。以 social-auth 的注册表单为例import { email, minLength } from remix/data-schema/checks import * as f from remix/data-schema/form-data import * as s from remix/data-schema export const signupSchema f.object({ name: f.field(s.string().pipe(minLength(1))), email: f.field(s.string().pipe(email())), password: f.field(s.string().pipe(minLength(8))), })含义name至少 1 个字符email必须通过email()检查password至少 8 个字符。表单提交过来的文本字段天然是字符串所以直接配s.string()如果某字段要当作数字、布尔或日期处理就改用coerce里对应的 schema如coerce.number()见>import { createMiddleware } from remix/router import { formData } from remix/middleware/form-data import { render } from remix/middleware/render import { staticFiles } from remix/middleware/static import { session } from remix/middleware/session import { loadDatabase } from ./middleware/database.ts import { loadAuth } from ./middleware/auth.ts function createSocialAuthMiddleware(cookie: Cookie, storage: SessionStorage) { return createMiddleware( staticFiles(./public, { cacheControl: no-store, must-revalidate, etag: false, lastModified: false, }), formData(), session(cookie, storage), loadDatabase(), loadAuth(), render(), ) }其中staticFiles/session/loadDatabase/loadAuth是该 demo 自己的业务中间件本任务真正关心的是formData()装好后 action 就能从 context 直接拿到解析好的formData不必自己再await request.formData()router.ts。在 action 里校验并返回 400action 从 context 解构出formData用parseSafe校验。parseSafe返回{ success, issues, value }success为true时value是校验后的类型化值为false时issues是{ message, path? }的数组data-schema README。失败分支重新渲染表单并置400import * as s from remix/data-schema import { signupSchema } from ./schemas.ts import { getIssueMessage, readSignupValues } from ../form-utils.ts async action({ db, formData, render, session, url }) { let result s.parseSafe(signupSchema, formData) if (!result.success) { return render( SignupPage error{getIssueMessage(result.issues)} values{readSignupValues(formData)} /, { status: 400 }, ) } let signup result.value // 成功后进入业务逻辑示例 demo 中查询/创建用户、写 session再 redirect 到结果页 }上面为了聚焦校验分支省略了 demo 里formAction、loginHref等与校验无关的 props完整写法见 signup 控制器。两个 helper 的作用getIssueMessage取第一条 issue 的message作为用户提示readSignupValues把已输入的name/email读回来让用户不用重填form-utils.tsexport function getIssueMessage(issues: ReadonlyArray{ message: string }): string { return issues[0]?.message ?? Please review the form and try again. }注意不要把密码、文件等敏感值原样回显到表单——示例里回显的只有name和email。成功时走redirect(...)章节文档说明为303重定向到结果页以避免刷新导致重复提交Forms and Mutations。运行示例并验证 400在 social-auth 示例里起服务用不合法的注册表单触发400确认失败分支真的返回400并回显表单cd demos/social-auth cp .env.example .env pnpm install pnpm db:reset pnpm start环境要求 Node 24.3.0package.json本地凭证流程只需SESSION_SECRET一个变量。启动后按 social-auth README 在 http://127.0.0.1:44100 打开。注册路由是form(/auth/signup)即GET /auth/signup展示表单、POST /auth/signup提交见 routes.ts。验证方式提交不合法的值例如password少于 8 个字符或email写成不符合邮箱格式响应状态应为400页面把表单重新渲染并显示第一条 issue 的 message。提交合法值则跳过400分支进入成功路径并redirect到结果页。适用边界本文只覆盖校验失败时回到表单这一路径登录、忘记密码、重置密码等其它表单在示例中复用的是同一套f.objectparseSafe400写法。请求 schema 只校验外部输入数据真正落到表时表级不变量由remix/data-table的validate/ 生命周期钩子负责二者应保持分离Data and Validation。【免费下载链接】remixThe fully-stacked web framework项目地址: https://gitcode.com/GitHub_Trending/re/remix创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

LoRa数传模块实战:5KM透明传输与工业级落地全解析 2026/9/12 3:13:54

LoRa数传模块实战:5KM透明传输与工业级落地全解析

做无线数传项目这些年,LoRa数传模块在我手里的出场率一直居高不下。最近帮一位做智慧农业的朋友搭建一套微型LoRa数传模块方案,需求听起来简单但执行起来相当磨人:田间地头的采集节点和网关之间最远要到5KM,数据必须双向透明传输&…

阅读更多 →
Apache Airflow Helm Chart 2.x 开发分支策略与维护指南:从 1.2x 到 2.0 的升级路线、Backport 机制与 Kustomize Overlay 实践 2026/9/12 3:13:54

Apache Airflow Helm Chart 2.x 开发分支策略与维护指南:从 1.2x 到 2.0 的升级路线、Backport 机制与 Kustomize Overlay 实践

Apache Airflow Helm Chart 2.x 开发分支策略与维护指南:从 1.2x 到 2.0 的升级路线、Backport 机制与 Kustomize Overlay 实践 【免费下载链接】airflow Apache Airflow - A platform to programmatically author, schedule, and monitor workflows 项目地址: ht…

阅读更多 →
STC15+CS1237电子秤实战:从ADC驱动到标定算法 2026/9/12 3:13:54

STC15+CS1237电子秤实战:从ADC驱动到标定算法

简介:基于STC15单片机和CS1237高精度ADC模块,结合0.96寸OLED显示的电子秤软件设计资料,面向单片机学习者和电子秤方案开发者。资源包含完整工程源码、头文件与底层驱动,覆盖CS1237数据采集、OLED_IIC显示、按键处理及EEPROM存储等…

阅读更多 →
PR Validation Report: {number} 2026/9/12 3:13:54

PR Validation Report: {number}

PR Validation Report: #{number} 【免费下载链接】Archon The first open-source harness builder for AI coding. Make AI coding deterministic and repeatable. 项目地址: https://gitcode.com/GitHub_Trending/archon3/Archon Title: {PR title} URL: {PR URL} Bra…

阅读更多 →
LlamaIndex 图存储集成实战:在 Neo4j、NebulaGraph、FalkorDB、Amazon Neptune 与 TiDB 上构建知识图谱 2026/9/12 3:13:54

LlamaIndex 图存储集成实战:在 Neo4j、NebulaGraph、FalkorDB、Amazon Neptune 与 TiDB 上构建知识图谱

LlamaIndex 图存储集成实战:在 Neo4j、NebulaGraph、FalkorDB、Amazon Neptune 与 TiDB 上构建知识图谱 【免费下载链接】llama_index LlamaIndex is the document processing platform for AI 项目地址: https://gitcode.com/GitHub_Trending/ll/llama_index …

阅读更多 →
企业HW保障实战指南:从资产梳理到应急响应的完整路径 2026/9/12 3:10:53

企业HW保障实战指南:从资产梳理到应急响应的完整路径

最近被问到最多的问题,就是“什么是HW”和“企业到底怎么做HW保障”。作为在安全运维和攻防对抗一线待了很多年的人,我觉得这事值得写一篇长文讲透。HW这个词,在网络安全圈里已经不算新鲜,它本质上就是一次集中的、高强度的攻防实…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞