尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

StoryBooks CRUD 全流程精读:method-override 让 POST 表单也能 PUT 和 DELETE 的完整指南

StoryBooks CRUD 全流程精读:method-override 让 POST 表单也能 PUT 和 DELETE 的完整指南 StoryBooks CRUD 全流程精读method-override 让 POST 表单也能 PUT 和 DELETE 的完整指南【免费下载链接】storybooksNode.js app with Google OAuth项目地址: https://gitcode.com/gh_mirrors/st/storybooksStoryBooks 是一个基于 Node.js Express MongoDB 的故事应用支持创建公开/私有故事并通过 Google OAuth 登录。本文带你精读它的完整 CRUD 流程讲透 method-override 中间件如何让普通 POST 表单变身提交 PUT 和 DELETE 请求。为什么浏览器表单只会发 POSTHTML 表单原生只支持GET和POST两种提交方式而 REST 风格约定用四种 HTTP 方法操作数据HTTP 方法含义StoryBooks 中的对应场景GET读取数据查看故事列表 / 故事详情POST创建数据新增一篇故事PUT更新数据编辑已有故事DELETE删除数据删除一篇故事表单发不了PUT/DELETE怎么办这就是 method-override 要解决的问题把更新和删除伪装成 POST 提交服务端在路由之前把请求还原成真正的方法。method-override 工作原理一个隐藏字段搞定一切思路非常直白分两步前端在 POST 表单里放一个名为_method的隐藏字段值填真实方法比如PUT或DELETE服务端中间件读取请求体中的_method把请求方法改成它指定的值然后删掉这个字段再交给后续路由。 中间件的接入位置在入口文件app.js中注册在所有路由之前保证对每个请求生效app.use( methodOverride(function (req, res) { if (req.body typeof req.body object _method in req.body) { let method req.body._method; delete req.body._method; return method; } }) ); 注意delete req.body._method这一步处理完必须把_method从请求体里删掉否则这个技术字段会混进业务数据甚至被写进数据库。PUT / DELETE 表单怎么写看这两处编辑页POST 伪装成 PUT编辑视图views/stories/edit.hbs中表单 action 指向故事 ID、method 是 POST同时藏了一个_methodPUTform action/stories/{{story._id}} methodPOST input typehidden name_method valuePUT !-- 标题、状态、正文输入框 -- /form删除按钮POST 伪装成 DELETE仪表盘views/dashboard.hbs里那个红色垃圾桶并不是a链接而是一个迷你表单form action/stories/{{_id}} methodPOST input typehidden name_method valueDELETE / button typesubmit classbtn red️/button /form⚠️ 为什么不用链接直接删除了浏览器链接只能 GET 之外用表单提交才能让服务端路由用router.delete()精确匹配也更利于后续加二次确认逻辑。StoryBooks CRUD 全流程一览所有故事相关路由集中在routes/stories.js每条路由都挂着登录中间件ensureAuth定义在middleware/auth.js未登录一律拦截。1️⃣ Create —— POST /stories表单来自views/stories/add.hbs正常 POST 到/stories路由把当前登录用户 ID 写入req.body调用Story.create()落库然后重定向到仪表盘2️⃣ Read —— GET /stories 与 GET /stories/:idGET /stories查所有公开故事按创建时间倒序GET /stories/:id看单篇故事私有故事只有作者本人能看否则返回 404 页面另有两条实用路由GET /stories/user/:userId看某人的公开故事和GET /stories/search/:query按标题搜索3️⃣ Update —— PUT /stories/:id实际提交是 POST _methodPUT先校验这条故事是不是你的不是就重定向走人通过后用Story.findOneAndUpdate()更新并跳回仪表盘因为 method-override 已把方法还原为 PUT所以router.put()能直接接住4️⃣ Delete —— DELETE /stories/:id实际提交是 POST _methodDELETE同样先做归属校验再执行Story.deleteOne()删除最后重定向回仪表盘数据模型层由models/Story.js和models/User.js两个 Mongoose 模型支撑故事与作者是多对一关系查询时用.populate(user)把作者信息带出来。关键要点清单✅method-override 是核心浏览器表单只支持 GET/POST_method隐藏字段 服务端中间件是标准解法✅中间件要注册在路由之前StoryBooks 在app.js里靠前的位置注册才能对所有请求生效✅处理完删除_method避免技术字段污染业务数据✅更新/删除先校验归属PUT/DELETE 都先确认记录属于当前用户REST 语义和安全性一个不能少✅前端全走 POST后端保持 REST 语义路由层用router.put/router.delete清晰表达意图四步跑起来动手验证一遍克隆仓库git clone https://gitcode.com/gh_mirrors/st/storybooks安装依赖npm install准备.env配置文件填入 MongoDB 连接串和 Google OAuth 凭据详细步骤见 readme.md 中的 Setup 部分启动项目npm run dev打开浏览器用 Google 登录后在仪表盘新增、编辑、删除故事同时打开开发者工具的 Network 面板观察请求方法显示为 POST而服务端却按 PUT / DELETE 处理——这就是 method-override 的魔法时刻 ✨小结StoryBooks 是一个小而完整的 CRUD 案例它用最小的代价展示了 Express 服务端渲染项目中POST 表单模拟 PUT/DELETE的标准姿势。理解了 method-override 这个模式你以后写任何带更新、删除表单的 Node.js 应用都不再发愁。建议上手时按app.js→routes/stories.js→ 两个含_method的视图这个顺序阅读十分钟内就能把整条链路串通。【免费下载链接】storybooksNode.js app with Google OAuth项目地址: https://gitcode.com/gh_mirrors/st/storybooks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表