走进 Leverage OJ / 第 8 课
从浏览器请求走进 Node.js
建立浏览器、服务端、HTTP 与 JSON 的基本图景,用 OJ 提交问题理解后端做什么。
前几课我们用 JavaScript 和 TypeScript 描述数据、函数与异步过程。现在把它们放进一个真实场景:在 OJ 页面按下“提交”,代码并不会直接从浏览器跳进评测机。浏览器是运行网页的客户端,负责收集题目、代码和语言等输入;服务端运行应用程序,负责接收请求、确认用户身份、检查数据、保存提交,并安排后续工作。
浏览器与服务端通常通过 HTTP 通信。一次请求包含方法、路径、标头和可选正文;响应会带回状态码与数据。例如,提交代码可以用 POST 表示“创建一项资源”,把数据放在正文中。成功接收和程序答对是两回事:服务端可能先确认创建了提交,评测结果稍后才产生。GET 常用于读取,例如查询提交状态。
正文常用 JSON 表达。它看起来像 JavaScript 对象,但 JSON 是跨程序交换的文本格式:对象键名和字符串都要用双引号。浏览器中的对象需要序列化成文本才能发送,收到的响应也要解析后才能作为 JavaScript 数据使用。JSON 本身不证明内容有效;恶意或旧版本客户端都可能发送缺字段、错类型或超长代码。
服务端代码可以由 Node.js 运行。它提供 JavaScript 运行环境及网络、文件等服务端能力;框架则帮团队组织路由和业务代码。Leverage OJ 的后端使用 NestJS:收到请求后由 Controller 找到对应处理入口,再把具体业务交给 Service。前端可以限制输入方便用户,但服务端仍必须独立校验,因为客户端不是可信边界。
把流程想成前台收件:浏览器交来一份格式化的请求,HTTP 负责送达,后端核对并登记,评测则是之后的工作。理解这个边界后,再看代码时就能分辨哪些语句属于网页,哪些在服务器执行,也不会把“HTTP 请求成功”误读为“答案正确”。
小练习
有人发送 POST 请求并收到成功响应,这是否说明代码已经通过所有测试?请求中的 JSON 又是什么?
**答案:**不能。成功响应只说明该接口完成了响应所代表的操作;是否通过要看评测结果。JSON 是请求或响应中的数据文本,不等同于浏览器里的 JavaScript 对象。
去真实仓库看看
在固定版本的 submission.controller.ts 创建提交入口 可以看到,路由方法接收用户与请求 DTO,再调用 Service。下一课拆解 NestJS 怎样提供这些结构。
互动练习:认识 HTTP 请求
HTTP 请求中,哪一部分通常用来表示要访问的资源路径?
浏览器把 HTTP 请求发给服务端;Node.js 能运行 JavaScript 后端,JSON 是常见的数据交换格式。