Summary
Overview
本课程系统讲解了基于 Node.js 的全栈 Web 应用开发流程,涵盖包管理器(NPM/PM)的使用与优化、国内源配置、HTTP 服务器搭建、RESTful API 设计、前后端交互、表单验证、跨域安全策略(CORS)及服务器端数据校验等核心内容。通过一个“生产报表管理系统”实战项目,演示了从后端服务启动、前端页面交互到数据提交与验证的完整闭环,强调前后端双重校验的安全开发原则。
Topic (Timeline)
1. NPM 包管理问题与 PM 的引入 [00:00:04.240 - 00:02:51.780]
- NPM 会为不同项目安装多个版本的依赖包,导致磁盘空间浪费(如多个 MIDI Player 1.0 和 2.0 共存)。
- 大型 Node.js 项目可能占用高达 10GB 的磁盘空间,严重影响小容量硬盘(如 128GB)的项目开发能力。
- PM 被提出作为更优的包管理解决方案,其使用方式与 NPM 基本一致,推荐作为主流工具。
2. 国内网络问题与 npm 源切换 [00:02:51.780 - 00:06:22.920]
- 国内访问 npm 官方源(境外)存在下载慢或失败问题。
- 阿里巴巴提供国内镜像源,可显著提升下载速度。
- 推荐新环境执行命令切换源(Windows 需先调整安全策略)。
- 介绍
axios作为 HTTP 请求封装库,用于简化前后端通信(后续项目中使用)。
3. HTTP 服务器搭建与核心模块 [00:06:22.920 - 00:09:15.880]
- 使用 Node.js 内置模块创建 HTTP 服务器:
http:提供 HTTP 协议封装,用于创建服务器。fs:文件系统操作(读/写/删文件)。path:路径拼接与解析(如文件名与扩展名分离)。url:URL 解析与处理。
- 通过
http.createServer()创建服务器,使用.listen(3000)监听本地 3000 端口。 - 服务器相当于一个“门牌号”,浏览器访问
localhost:3000即可连接。
4. HTTP 请求方法与 API 设计 [00:09:16.880 - 00:15:16.310]
- 五种常用 HTTP 方法:
GET:获取资源(如加载生产报表)。POST:创建新资源(如提交生产记录)。PUT:更新已有资源(通过 ID 定位)。DELETE:删除资源。OPTIONS:跨域预检请求(开发中通常直接返回 200)。
- 服务器通过
request.method和request.url匹配路径与方法,执行对应逻辑。 - 使用
JSON.stringify()将对象转为 JSON 字符串返回前端。 - 未匹配路径时,尝试返回本地
index.html文件;若文件不存在或读取失败,返回错误响应。
5. 跨域访问(CORS)机制与配置 [00:15:16.310 - 00:25:23.800]
- 浏览器同源策略限制:仅允许同域名(如
baidu.com)下的页面访问其 API,跨域请求(如taobao.com→baidu.com)会被拒绝。 - CORS 通过响应头
Access-Control-Allow-Origin控制允许访问的源。 - 服务器配置示例:
Access-Control-Allow-Origin: *:允许任意源(开发环境)。Access-Control-Allow-Methods: GET, POST, OPTIONS:限制允许的请求方法。Access-Control-Allow-Headers:允许自定义请求头。
- 实际项目中,CORS 配置应由 Nginx 等网关统一管理,而非硬编码在代码中。
6. 前端交互:表单绑定与事件拦截 [00:25:27.520 - 00:31:54.560]
- 前端通过
document.getElementById('production-form')获取表单元素。 - 使用
addEventListener('submit', handler)拦截表单默认提交行为,避免页面跳转。 - 通过
axios发送POST请求至/api/production/submit,提交表单数据。 - 成功后:刷新报表、重置表单;失败时:显示错误提示。
- 传统表单提交会触发页面刷新,而 JS 拦截实现无刷新体验(SPA 模式)。
7. 表单前端验证逻辑 [00:32:01.120 - 00:39:48.900]
- 验证字段:生产日期、产品名称、生产数量。
- 验证规则:
- 日期不能为未来时间。
- 产品名称必填。
- 数量必须为正整数,且 ≤10000。
- 验证失败时,显示具体错误信息;成功则提交数据。
- 强调:前端验证仅提升体验,不能替代后端验证。
8. 项目运行与调试流程 [00:39:57.600 - 00:47:34.890]
- 在终端执行
node server.js启动服务器,监听localhost:3000。 - 浏览器访问
http://localhost:3000加载前端页面,自动加载axios-min.js、style.css、script.js等静态资源。 - 通过浏览器 DevTools(F12)的 Network 面板观察请求:
GET /→ 加载主页。GET /api/production/report→ 获取生产数据(返回 JSON)。POST /api/production/submit→ 提交数据(携带 payload)。
- 服务器返回
{"success": true, "data": [...]}结构,前端据此更新 UI。
9. 服务器端数据校验与安全原则 [00:47:34.890 - 01:02:43.460]
- 核心原则:任何客户端数据均不可信,必须在服务端重复验证。
- 前端验证代码(JS)需在后端(Node.js)重写,但需适配无 DOM 环境:
- 移除 DOM 操作(如清空错误提示、修改样式)。
- 仅返回
isValid: boolean和错误信息。
- 使用
JSON.parse()将请求体(req.body)从字符串转为对象。 - 引入
try-catch处理JSON.parse()异常,防止服务器崩溃。 - 若未加
try-catch,非法请求会导致 Node.js 进程直接退出(服务宕机)。
10. 使用 curl 模拟非浏览器请求与调试 [01:02:45.660 - 01:09:11.900]
- 使用
curl命令行工具模拟非浏览器客户端(如自动化脚本)访问 API。 - 需手动设置请求头:
Content-Type: application/json。 - 通过
console.log()输出接收到的请求体,进行调试。 - 演示:发送非法数据(如未来日期)→ 服务端验证失败 → 返回 400 或拒绝处理。
- 强调:服务器端验证是安全防线,前端验证是体验优化。
11. 课后挑战:功能扩展 [01:09:14.320 - 01:12:32.400]
- 挑战一(简单):将“提交”按钮改为“更新”功能,根据 ID 修改已有记录(而非新增)。
- 挑战二(困难):新增“删除”功能:
- 提供输入框,允许用户输入记录 ID。
- 点击“删除”按钮,向
/api/production/delete发送DELETE请求。 - 服务端根据 ID 删除对应记录并返回结果。
Appendix
Key Principles
- 双重验证:前端验证提升体验,后端验证保障安全,二者缺一不可。
- 不可信客户端:任何来自客户端的数据(包括请求头、参数、JSON)都必须在服务端重新校验。
- 异常防护:使用
try-catch包裹JSON.parse()等易出错操作,避免服务崩溃。 - CORS 配置:生产环境应限制
Access-Control-Allow-Origin为可信域名,避免使用*。
Tools Used
- Node.js:运行时环境。
- NPM / PM:包管理器。
- axios:HTTP 客户端库(前端)。
- http, fs, path, url:Node.js 内置核心模块。
- curl:命令行 HTTP 客户端(用于调试)。
- Browser DevTools (F12):网络请求分析、调试。
Common Pitfalls
- 仅依赖前端验证,导致 API 被恶意调用。
- 未使用
try-catch处理JSON.parse(),服务因非法 JSON 崩溃。 - 误将
POST /api/production/report当作提交路径(应为/api/production/submit)。 - 忽略
OPTIONS预检请求,导致跨域失败。
Practice Suggestions
- 手动实现“更新”和“删除”功能,巩固 RESTful API 理解。
- 尝试用
curl发送不同格式的请求(如缺少Content-Type、非法 JSON),观察服务端行为。 - 将 CORS 配置从代码中移至 Nginx,学习生产级部署模式。
- 为服务器添加日志记录,追踪请求来源与处理结果。