1. JavaScript 前置#
变量、基本类型、数组、对象、函数、作用域、模块。 Promise、async/await、try/catch。 事件循环的基本模型:I/O 等待时不会简单地阻塞整个服务,但 CPU 密集工作仍可能阻塞事件循环。
若这些内容很陌生,先用 1 周补基础;不要一边猜语法一边学框架。
2. Node.js#
package.json、依赖与开发依赖、npm scripts。 环境变量、文件路径、ES 模块、内置 HTTP 模块。 异步错误处理;程序启动和优雅关闭的基本概念。 Node.js 版本使用 LTS,提交锁文件,了解依赖安全更新。
3. Express#
路由:方法 + 路径 + 处理函数。 中间件执行顺序、JSON 解析、认证、错误处理中间件。 请求参数来源:路径参数、查询参数、请求体、请求头。 统一响应和错误格式;404 与 500 分开处理。
建议结构(先保持简单):
src/
app.js # Express 配置
server.js # 启动与关闭
routes/ # 路由映射
controllers/ # HTTP 输入输出
services/ # 业务规则
repositories/ # 数据库访问
middleware/ # 认证、错误、日志
db/ # 连接、迁移
tests/不要为了“架构高级”制造十层目录。目标是路由、业务、数据访问各自职责清楚且容易测试。
4. REST API 设计#
POST /api/v1/tasks 创建任务
GET /api/v1/tasks 列表、过滤、分页
GET /api/v1/tasks/:id 获取一个任务
PATCH /api/v1/tasks/:id 修改任务
DELETE /api/v1/tasks/:id 删除任务使用名词和一致的复数形式;正确使用状态码;分页设置上限;错误信息可理解但不泄露内部堆栈或 SQL。 版本路径、幂等性、API 文档(OpenAPI)。
5. 数据库接入#
使用连接池和参数化查询。 事务必须使用同一数据库连接,并保证出错回滚、最后释放连接。 迁移文件进入版本管理;生产环境不依赖应用启动时自动随意修改表。 ORM 能提高效率,但不能替代 SQL、约束、事务和索引知识。初学项目建议先使用数据库驱动写一部分原生 SQL,再选择 ORM。
6. 输入、认证和授权#
所有外部输入都不可信:验证类型、长度、格式、范围和允许字段。 密码使用专门的慢哈希算法;永不记录密码、Token、数据库密码。 每个读取/修改接口都检查资源所有权或角色权限,不能只在前端隐藏按钮。 登录接口需考虑频率限制;Cookie 方案需理解 HttpOnly、Secure、SameSite 和 CSRF。 Token 不是“加密一切”;应设置有效期、验证签名和声明,并规划撤销/刷新策略。
7. 错误、日志和测试#
异常集中处理;业务错误与未知错误分开。 日志包含时间、级别、请求 ID、路径、状态码、耗时;敏感字段脱敏。 测试正常路径和失败路径:无效输入、未登录、越权、不存在、数据库冲突。 单元测试业务逻辑,集成测试 API + 测试数据库。
阶段验收#
- 能从空目录建立 Express 项目并运行健康检查接口。
- 能解释一个请求经过哪些中间件。
- CRUD 使用参数化查询,列表有分页上限。
- 登录密码不明文存储,接口区分认证与授权。
- 统一处理 400/401/403/404/409/500。
- 至少写 15 个自动化测试,包含失败和越权场景。
- README 写清启动、迁移、测试方法及环境变量名称。