learnyounode 第十一关:编写 HTTP JSON API 服务器(http_json_api_server)实战指南

发布时间:2026/9/29 5:24:17

learnyounode 第十一关:编写 HTTP JSON API 服务器(http_json_api_server)实战指南 教程CLI【免费下载链接】learnyounodeLearn You The Node.js For Much Win! An intro to Node.js via a set of self-guided workshops.项目地址https://gitcode.com/gh_mirrors/le/learnyounode点击查看免费下载本篇技术指南围绕 learnyounode 交互式教程中的HTTP JSON API 服务器练习exercises/http_json_api_server展开讲解如何基于 Node.js 内置http、url与Date模块构建一个提供/api/parsetime与/api/unixtime两个 JSON 接口的服务器。读完本文你将掌握new URL()解析请求路径与查询参数、按路由分发请求、用JSON.stringify()输出 JSON 并正确设置Content-Type的完整套路并了解官方自动化验证器exercise.js与测试用例test/http_json_api_server/如何校验你的实现。练习目标两个 JSON 端点 命令行端口参数本练习要求你创建http-json-api-server.js文件编写一个 HTTP服务器server并在收到以下两种 GET 请求时返回 JSON 数据路径/api/parsetime请求的 query string 中包含键为iso、值为 ISO 格式时间的参数响应 JSON 只包含hour、minute、second三个属性。路径/api/unixtime接收相同的 query string但响应中的unixtime属性值是 UNIX epoch 时间即自 1970 年 1 月 1 日 00:00:00 UTC 起的毫秒数。服务器必须监听命令行第一个参数指定的端口。典型请求与响应示例如下请求 /api/parsetime?iso2013-08-10T12:10:15.474Z 响应 { hour: 14, minute: 23, second: 15 } 请求 /api/unixtime?iso2013-08-10T12:10:15.474Z 响应 { unixtime: 1376136615474 }动手前建议先浏览 Node 官方url模块文档仓库内已归档于 docs-nodejs/url.html它是解析 URL 与 query string 的核心工具。关键知识点拆解1. 用request.url做路由分发HTTP 服务器的request对象带有url属性它保存着本次请求的路径与查询字符串。你可以通过它来“路由”route请求到两个端点例如用正则^/api/parsetime、^/api/unixtime对req.url做前缀匹配见 官方参考实现。这种方式无需引入任何路由框架完全依赖 Node 核心模块即可完成。2. 用new URL(request.url)解析查询参数URL 需要传两个参数才能正确解析相对路径因此官方提示中给出了固定基址写法$ node -pe new URL(/test?q1, http://example.com)返回的 URL 对象包含searchParams等实用属性可通过new URL(request.url, http://example.com).searchParams.get(iso)直接取出iso参数值参考 参考实现。注意new URL()是 Node 的 WHATWG URL 实现非旧式url.parse()它天然支持searchParams.get()比手动拆分 query string 更安全、更简洁。3.Date对象ISO 字符串 ↔ 时间值双向转换解析把iso字符串直接传给Date构造函数即可得到对应时间对象const time new Date(isoString)。输出new Date().toISOString()可生成 ISO 格式字符串Date#getTime()返回自 1970-01-01 00:00:00 UTC 起的毫秒数正是/api/unixtime需要的数值。4.JSON.stringify() 正确的Content-Type响应的 body 必须是 JSON字符串因此需要JSON.stringify(result)序列化。同时要做“Web 世界的好公民”正确设置Content-Typeres.writeHead(200, { Content-Type: application/json })完整可运行的参考实现仓库提供的标准解法位于 exercises/http_json_api_server/solution/solution.js核心代码如下use strict const http require(http) function parsetime (time) { return { hour: time.getHours(), minute: time.getMinutes(), second: time.getSeconds() } } function unixtime (time) { return { unixtime: time.getTime() } } const server http.createServer(function (req, res) { const parsedUrl new URL(req.url, http://example.com) const time new Date(parsedUrl.searchParams.get(iso)) let result if (/^\/api\/parsetime/.test(req.url)) { result parsetime(time) } else if (/^\/api\/unixtime/.test(req.url)) { result unixtime(time) } if (result) { res.writeHead(200, { Content-Type: application/json }) res.end(JSON.stringify(result)) } else { res.writeHead(404) res.end() } }) server.listen(Number(process.argv[2]))实现要点解析端口参数server.listen(Number(process.argv[2]))将第一个命令行参数转换为数字并监听。对比测试文件中的process.argv[2] | 0写法见 test/http_json_api_server/valid_01.js两者都用于把参数强制转换为数值但Number()语义更直白。非法路由处理当两个端点都不匹配时返回404此时result为undefined。测试用例 test/http_json_api_server/invalid_01.js 甚至是一个空文件用于验证完全不实现时的失败行为而 invalid_02.js 与 invalid_03.js 分别把unixtime数值加 1、把hour加 1用于校验“数值不准确会被判错”的边界场景。getTime()是方法而非属性官方提示中写作Date#getTime()而unixtime函数里必须调用time.getTime()带括号不能误写成time.getTime否则返回的是函数体字符串而不是毫秒数。自动化验证机制exercise.js 如何判定对错本练习的判定逻辑封装在 exercises/http_json_api_server/exercise.js 中理解它有助于你自查实现是否符合验收标准并行启动验证器基于workshopper-exercise的execute处理器用spawn()并行运行你的提交文件与官方参考解法并通过rndport()见 lib/rndport.js端口范围 102465535 随机为两者分配相邻的随机端口submissionPort与submissionPort 1。延迟查询addProcessor中通过setTimeout(query.bind(this, mode), 500)等待 500ms确保两个服务器启动完成后才开始请求。请求两个端点query()用hyperquest.get()依次请求http://localhost:{port}/api/parsetime?iso...与/api/unixtime?iso...请求所用的iso时间戳为new Date(Date.now() - 100000)即当前时刻前 100 秒见 exercise.js。JSON 规范化后比对收到的响应经normalizeJSON()即JSON.stringify(JSON.parse(data))重新序列化后写入 stdout最终由comparestdout处理器与参考解法的输出逐字节比较——这解释了为什么属性顺序、多余空格不会导致误判但数值错误如 invalid 用例中“1”会被精确捕捉。因此只要你的服务器能对上述两个端点返回与官方解法语义一致数值精确的 JSON即可通过验证Content-Type与状态码虽不影响 stdout 比对但仍是良好实现的重要部分。验收命令与排错建议编写完http-json-api-server.js后在 learnyounode 交互界面中运行$ learnyounode verify http-json-api-server.js仓库中对应命令模板为{appname} verify http-json-api-server.js其中{appname}即learnyounode。除此之外你还可以用learnyounode run http-json-api-server.js直接启动程序然后手动测试$ node http-json-api-server.js 8000 $ curl http://localhost:8000/api/parsetime?iso2013-08-10T12:10:15.474Z $ curl http://localhost:8000/api/unixtime?iso2013-08-10T12:10:15.474Z常见踩坑点自查清单忘记Number()转换端口参数导致listen收到字符串对iso参数未做new Date(...)解析就直接调用getHours()误用Date#getTime缺括号导致返回函数体使用旧式url.parse()而忘记其在新版本 Node 中已被标记为 legacy API两个端点之外的路径未返回404可自行加上res.writeHead(404)以提升健壮性。小结通过本练习你将完整走通“Node HTTP 服务器 WHATWG URL 解析 Date 时间换算 JSON 序列化 Content-Type 设置”这条典型链路。这与 learnyounode 前序的 http_client、http_file_server 等练习一脉相承前者教你发起请求后者教你响应文件流而本练习则首次引入“按路径路由 返回结构化 JSON 数据”的 API 服务形态为后续编写真实后端接口打下坚实基础。赞分享教程CLI【免费下载链接】learnyounodeLearn You The Node.js For Much Win! An intro to Node.js via a set of self-guided workshops.项目地址https://gitcode.com/gh_mirrors/le/learnyounode点击查看免费下载相关推荐learnyounode 实战编写 HTTP JSON API 服务器http_json_api_server 通关指南learnyounode 实战编写 HTTP JSON API 服务器http_json_api_server 通关指南 本文以 learnyounode教程CLIOpenLogi Hook 跨平台输入捕获架构CGEventTap、evdevuinput 与 WH_MOUSE_LL 的实现与冻结防护OpenLogi Hook 跨平台输入捕获架构CGEventTap、evdevuinput 与 WH_MOUSE_LL 的实现与冻结防护 导读 openlo教程CLImypy 错误码Error Code体系完全指南从 type: ignore[code] 到按模块细粒度控制mypy 错误码Error Code体系完全指南从 type: ignore code 到按模块细粒度控制 mypyOptional static ty教程CLI上一篇RAFT-stereo与ONNXCPU/GPU推理实现与性能对比完整指南下一篇EMO-2B完整使用指南从基础对话到高级情感支持技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/29 5:19:17

【GitHub项目实战】DINet 实现音频驱动的数字人口型同步

视频对口型生成技术已成为数字人内容合成中的关键环节。DINet 项目以逐步细化的生成架构和同步感知训练策略,在口型同步度与视觉真实感之间找到良好平衡,适用于低资源环境下的高质量人脸驱动场景。 围绕 DINet 的完整训练与推理流程,本文解析其环境搭建、数据预处理、模型训…

2026/9/29 5:19:17

【GitHub项目实战】GOTURN 实现深度学习目标跟踪

GOTURN,即“Generic Object Tracking Using Regression Networks”,是一种突破传统对象跟踪模式的深度学习算法。不同于需在线更新的跟踪方法,GOTURN通过在离线状态下预先学习对象的运动特征,实现了对视频目标的高效跟踪。其核心在于使用卷积神经网络(CNN)训练模型以预测…

2026/9/29 5:19:17

【GitHub项目实战】ChatGLM-6B 搭建双语对话应用

深度学习和自然语言处理的领域中,硬件环境和模型配置直接决定了项目的成功与否。特别是当涉及到大规模预训练模型的运行时,合理地管理和使用系统资源尤为关键。本项目的设置与配置旨在帮助开发者快速构建一个能够高效运行的ChatGLM模型环境,尤其是在利用GPU进行推理和训练的…

2026/9/29 6:24:19

深入浅出 DeepSeek MoE:EP 与 FSDP 经典二次开发实战指南

文档教程人工智能大模型RLHF 【免费下载链接】Awesome-ML-SYS-Tutorial My learning notes for ML SYS. 项目地址: https://gitcode.com/gh_mirrors/aw/Awesome-ML-SYS-Tutorial 点击查看 免费下载 本指南以当前仓库 rlhf/sys-design/readme-4.md 为骨架&#xff0…

2026/9/28 3:03:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/28 6:05:15

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/28 6:07:41

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 0:04:04

AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

1. 为什么AI Evals值得你花时间搞明白做LLM应用的人,迟早会撞上同一堵墙:模型输出飘忽不定,今天答得好好的,明天换个问法就胡说八道。你改了一版提示词,感觉好像好了点,但到底好了多少?说不清。…

2026/9/29 0:04:04

Java采购管理系统实战:从数据库设计到事务一致性

简介:这是一套面向Java Web初学者与课程设计者的采购管理系统完整源码,采用JSP技术搭建,配合MySQL数据库,用于解决企业采购信息的管理问题,适合作为毕业设计、课程大作业或进销存类项目的参考模板。系统实现了用户登录…

2026/9/29 3:53:39

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/26 19:58:38

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/28 1:59:25

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑