教程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),仅供参考