“前后端分离”、“RESTful API”、“fetch 请求”……这些术语在技术文档里看过无数遍,但真正动手把一套完整的 HTTP 接口调用跑通,却让不少开发者吃尽了苦头。近日,一位名为“码上飞”的前端开发者分享了自己耗时两天、从理论到实践的“血泪”经历,引发了技术社区的热烈讨论。这场看似基础的“折腾”,恰恰折射出许多初学者在脱离教程、独立开发时面临的共性困境。
理论很丰满,实操全是坑
“码上飞”在文章中自嘲,自己啃完《JavaScript 高级程序设计》和若干篇《前后端分离最佳实践》后,自信满满地准备搭建一个“全栈 Demo”:用 Node.js + Express 写后端,前端用原生 HTML + CSS + JS 通过 fetch 调用接口,实现一个简单的用户登录功能。
然而,从第一个 fetch 请求开始,问题就接踵而至。第一步,他在本地同时启动了前端静态服务器(端口 5500)和后端 API 服务器(端口 3000)。浏览器打开页面后,控制台赫然报出 “CORS 错误”——跨域资源共享(Cross-Origin Resource Sharing)问题。书本上只写了一句话“后端设置允许跨域”,可具体怎么设置、预检请求是什么、复杂请求与简单请求的区别,全是一笔带过。“码上飞”花了整整一个上午才搞清楚:Express 需要安装 cors 中间件,并且要区分开发环境与生产环境下的跨域策略。
fetch 参数 — 比想象中更“挑剔”
跨域问题解决后,又迎来了第二个“拦路虎”:fetch 的参数设置。按照书本示例,他写下:
fetch('http://localhost:3000/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username: 'admin', password: '123456' })
})
结果后端始终收到 undefined 的请求体。排查半天才发现,后端 Express 没有内置 JSON 解析中间件,需要手动添加 app.use(express.json())。更让人崩溃的是,当后端返回非 JSON 格式(比如纯文本或错误状态码 4xx)时,fetch 默认不会自动抛出错误,而是依然进入 .then() —— 除非手动检查 response.ok。这个“隐晦”的设计让“码上飞”调试了整整一个下午,最后靠打印 response.status 才恍然大悟。
前后端分离的实际体验:数据流闭环
第二个白天,他总算让前端成功发送请求、后端正确响应。但“分离”的真正痛点在于 状态管理与协同。前端需要记录 token,并在后续请求的 header 中携带 Authorization;后端需要校验 token 并返回正确数据。由于没有使用框架(如 Axios 拦截器),他只能手动在每个 fetch 调用中添加 header,重复代码量惊人。更麻烦的是,当接口返回 401 未授权时,前端需要全局跳转到登录页——这就涉及到一个“伪单页应用”的路由管理,书本上只字未提。
“码上飞”最终不得不临时编写了一个简单的 request.js 工具函数,封装了公共 header、错误处理、token 刷新机制。这一过程让他深刻体会到:真正的前后端分离,绝不仅仅是“前端调接口、后端返回 JSON”,它还包括 统一的错误码规范、登录态保持、跨域安全策略、以及前后端联调时的版本对齐。而这些,往往是经典教程里被“省略”的暗礁。
从“会调接口”到“会做分离”
经过两天的奋战,他成功跑通了一个包含登录、数据列表、注销功能的完整流程。虽然代码还很粗糙,但“码上飞”在博客中感慨:“以前觉得 fetch 不过是 XMLHttpRequest 的语法糖,前后端分离就是把 HTML 和 API 分开。真正动手才发现,每一个细节都会让你回到起点重新查文档。”
他的经历很快在技术论坛引发共鸣。网友“@前端小林”评论:“第一次用 fetch 做 post 请求时,我也被 Content-Type 和 JSON.stringify 搞晕过,太真实了。” 更有资深开发者指出,许多培训机构只教“在 Vue/React 里用 Axios”,却忽略了原生 fetch 的基本功,导致学员一脱离框架就寸步难行。
总结:键盘上的“悟道”
这场“折腾两天”的实践,最终以成功收尾。“码上飞”将自己的代码和踩坑笔记整理后开源到 GitHub,并在 Readme 中写下一句话:“书本告诉我们‘是什么’,实操教会我们‘为什么’。前后端分离不是一个配置项,而是一整套工程思维的落地。”
对于所有正在从理论走向实战的开发者而言,这或许是一个最朴素也最深刻的启示:真正的进步,往往发生在你被错误逼到墙角、不得不自己翻文档的那一刻。 下一次,当新手再遇到 fetch 报错时,不妨静下心来,想想这背后还有多少“书里没写”的精彩。