一、你已经走了多远
回想一下,十一篇之前,你可能连“后端”是什么都只有一个模糊的概念。到现在,你已经:
- 用 Node.js 和 Express 从零写出了能处理路由、解析参数、响应 JSON 的 HTTP 服务。
- 用 MySQL 数据库替代了文件存储,实现了真正的数据持久化。
- 用 bcrypt 和 JWT 搭建了用户注册登录系统,理解了密码为什么要加密、Token 的原理是什么。
- 写了一个完整的留言板项目——注册、登录、发表留言、权限控制,五脏俱全。
- 把项目部署到了云服务器上,让它有了公网地址,可以被任何人访问。
这些东西不是一个“懂一点后端”的人能全部做到的。你已经具备了独立开发小型后端项目的能力。剩下的不是学什么新概念,而是把已有的东西用熟、用深、用稳。
这是本系列的最后一篇。我们不展开新技术,而是聊聊从“能写出功能”到“能写出靠谱的代码”之间那些必不可少的东西——一些让你少踩坑、少加班、少被同事吐槽的实战经验。
二、代码规范:别给自己和别人挖坑
代码写出来,机器能跑通,这只是及格线。真正好的代码,是人能看懂的代码——三个月后的你、接手你项目的同事,都能顺畅地读下去。
几个最容易做到也最有用的规范习惯:
给变量和函数起好名字
坏名字:let d = getData();——d 是什么?data?date?document?
好名字:let userList = getUserList();——一眼就知道这是一个用户列表。
不要怕名字长。现代编辑器都有自动补全,你不需要手打全名。但每省掉一个字符,读代码的人就要多花一秒去猜。
一个函数只做一件事
如果你的函数同时做了验证参数、查询数据库、发送邮件、返回响应,那当其中某一个环节需要修改时,整个函数都要动。拆开:validateInput()、queryDatabase()、sendResponse()。每个函数不超过二三十行,清晰独立。
错误处理不要偷懒
看过太多代码用 catch(error) { console.log(error) } 就算处理了。用户提交表单失败,看到的是白屏,服务器日志里倒是悄悄记了一行。
每个 catch 里至少做三件事之一:返回有意义的错误信息给客户端、记录完整的错误堆栈到日志、确保程序不会崩溃。用 console.error 而不是 console.log 来打印错误,这样日志工具能区分普通信息和错误。
把敏感信息藏起来
数据库密码、JWT 密钥、第三方 API 密钥——这些东西永远不要硬编码在代码里,更不要提交到 GitHub 上。你可能会觉得自己的小项目没什么价值,没人会盯着你。但爬虫脚本不挑食——它们全天候扫描 GitHub 上的公开仓库,寻找不小心提交的数据库密码和 API 密钥。用 .env 文件和 .gitignore 是保护自己的最简单防线。
三、调试:Bug 是常态,找 Bug 是技能
写代码免不了出 bug。新人常犯的错误是遇到 bug 就东改一处、西改一处,靠运气试。运气好能蒙对,但更多时候是改出了一堆新 bug。
一个靠谱的调试流程是:
- 稳定复现:能让 bug 稳定出现,问题就解决了一半。记下触发 bug 的精确步骤。
- 二分法缩小范围:注释掉一半代码,看 bug 还在不在。在的话问题在留下的这一半里,不在的话问题在注释掉的那一半里。反复几次,几分钟就能定位到具体代码。
- 看日志,别看空气:服务端的
console.log和console.error是你最好的线索。把请求的关键数据打印出来,包括参数、中间结果、SQL 语句。 - 最小复现:把怀疑出问题的逻辑单独摘出来,写一个最小化的测试脚本。如果问题消失了,说明是你的项目中其他部分造成的干扰;如果问题还在,说明就是这段逻辑本身有问题。
- 修复后验证:不仅要验证修好了这个 bug,还要验证修复没有引入新的 bug。至少把正常流程跑一遍。
四、安全:后端开发的底线
安全不是高级话题,是底线。你的服务一旦连上公网,就会收到来自全世界的扫描和攻击请求。一个最基础的清单:
- 密码必须哈希存储:bcrypt,不要用 MD5 或 SHA256 直接存。bcrypt 自带加盐,是目前最好的选择。
- SQL 注入防护:永远用参数化查询(
?占位符),永远不要拼接 SQL 字符串。记住,不是“尽量不要拼接”,是永远不要拼接。 - 接口鉴权:需要登录才能用的接口,一定要经过认证中间件检查 Token。不要以为前端藏了按钮就安全——攻击者根本不通过你的前端页面访问接口,他们直接用脚本发 HTTP 请求。
- 权限校验:即使登录了,也要检查这个用户有没有权限做这件事。删除留言前确认这条留言是他自己的。修改资料前确认他修改的是自己的而不是别人的。
- 输入验证:不相信任何来自用户的数据。邮箱格式对不对?数字范围合理吗?字符串长度有没有异常?服务端要做验证,不能只靠前端的表单校验。
- HTTPS:生产环境必须配置 HTTPS。用 Let’s Encrypt 可以免费申请 SSL 证书。没有 HTTPS,用户的密码在传输过程中就是明文,中间任何一个网络节点都能看到。
- .env 不要提交:这个前面说了,值得再说一次。检查你的
.gitignore文件,确保.env在里面。
五、性能:别让用户等
用户对速度的容忍度比你想象的低。页面加载超过 3 秒,大量用户就会放弃。
后端性能优化最有效的几件事:
- 数据库查询加索引:频繁作为查询条件的字段(比如
email、user_id)要加索引。CREATE INDEX idx_users_email ON users(email);能让查询速度从“遍历全表”变成“直接定位”。 - 避免 N+1 查询:如果你先查 100 条留言,然后循环每条留言再去查一次作者名字,你实际上执行了 101 次数据库查询。用 JOIN 一次搞定。
- 不需要的数据别查:
SELECT *有时候是偷懒,有时候是浪费。如果你只需要用户名,就不要把密码哈希值也查出来。 - 加缓存:不经常变但频繁被查询的数据(比如网站配置、热门文章列表),可以用 Redis 缓存起来,减少数据库压力。
六、版本控制:Git 不止是存代码
Git 是你代码的时光机。几个实用的习惯:
- 频繁提交:完成一个小功能点就提交一次,不要攒了几天的代码才提交。
- 写有意义的提交信息:“fix bug”是最糟糕的提交信息。“修复登录接口在邮箱含大写字母时查询失败的问题”是好的提交信息。一个月后你回头看,后者能让你秒懂这次改了什么。
- 用分支:开发新功能从主分支拉一个新分支,开发完了再合并回去。这样主分支始终保持稳定可部署的状态。
- .gitignore:
node_modules、.env、日志文件——这些不要提交。创建项目时第一时间配好.gitignore。
七、持续学习:往后怎么走
本系列带你入了后端开发的门。接下来可以往这些方向深入:
- 数据库进阶:学习索引优化、事务处理、读写分离、Redis 缓存策略。数据是后端最核心的部分,把数据库用好比学好任何框架都重要。
- 另一种语言:Python 在后端领域也非常流行(Django、FastAPI),Go 在高并发场景表现优秀。学会 Node.js 再学第二门后端语言,速度会快很多,因为底层概念都是相通的。
- 微服务架构:当一个项目大到一定程度,需要拆分成多个独立服务。了解服务间通信、API 网关、消息队列。
- 容器化:Docker 让你能把应用和它的运行环境一起打包,在任何服务器上都能一致地运行。Docker Compose 能一键启动应用加数据库。
- 看源码:Express 的源码不复杂,可以试着读一读它怎么实现路由匹配和中间件链。理解了底层,用任何框架都会得心应手。
- 读规范:HTTP 协议规范(RFC 7230-7235)、JWT 规范(RFC 7519)——当行为和预期不符时,最权威的答案在规范里。
最重要的学习方法还是那一条:做项目。教程看一百遍不如自己手写一遍。遇到不会的就去查文档、查 StackOverflow、读源码。在解决问题的过程中,你学到的东西比任何课程都深刻。
八、写在最后
《后端零基础入门》到这里就全部结束了。十二篇文章,从一行后端代码都不会写,到能独立开发并部署一个完整的留言板项目。这不是因为你多聪明,而是因为后端开发本就不是什么神秘的事情——它就是把前端发来的请求接收下来,查查数据库,处理一下,再返回结果。一遍又一遍。
复杂的是你在上面叠加的业务逻辑——怎么设计权限系统、怎么优化查询性能、怎么保证数据一致性。这些不是一朝一夕能全部掌握的,但你已经有了应对它们的底层框架。
如果你是从《前端·零基础入门》一路跟过来的,那你已经走完了一个全栈开发者最核心的一段路——前端能写界面,后端能写服务,数据库能设计。剩下的就是不断练习、不断深入、不断在项目中磨炼。
代码是写给人看的,服务是跑给人用的。保持好奇,保持耐心,遇到问题别慌,一步步排查。你比你自己想象的走得更远。
祝你在编程这条路上,走得稳,走得远,也走得开心。
——后端零基础入门,全系列完。













暂无评论内容