learnyounode 教程:使用 http.get() 与 Stream 事件流编写 Node.js HTTP 客户端
教程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 CLIENT」关卡为骨架系统讲解如何用 Node.js 核心模块http发起 HTTP GET 请求并通过响应流Stream的data/error/end事件逐块读取响应内容。读完本文你将掌握http.get()的用法、Node Stream 的事件监听模式、setEncoding(utf8)对数据类型的影响并能结合仓库源码理解 learnyounode 的本地测试服务器是如何验证你提交的代码的。1. 关卡背景learnyounode 工作坊中的 HTTP CLIENTlearnyounode 是一套以「自引导式练习」驱动学习者入门 Node.js 的开源工作坊详见 README.md 中的项目定位说明。在 learnyounode.js 中可以看到整套课程的注册顺序HELLO WORLD、BABY STEPS、MY FIRST I/O!、MY FIRST ASYNC I/O!、FILTERED LS、MAKE IT MODULAR之后紧接着就是HTTP CLIENT随后是HTTP COLLECT、JUGGLING ASYNC、TIME SERVER、HTTP FILE SERVER、HTTP UPPERCASERER、HTTP JSON API SERVER等网络相关练习。也就是说HTTP CLIENT 是学习者从「文件系统 I/O」过渡到「HTTP 网络编程」的第一课。它的定位是只做一件事——用最直接的方式发一个 GET 请求并把响应的数据原样打印出来不涉及数据聚合、不涉及服务器端开发为后续HTTP COLLECT收集全部响应再输出等关卡打好事件流基础。本关卡的任务描述与提示完整收录在 exercises/http_client/problem.pt-br.md葡萄牙语版本英文原版见 exercises/http_client/problem.md。2. 任务要求逐条拆解原文档给出的任务非常具体可以拆成以下四个硬性要求发起 HTTP GET 请求目标 URL 由命令行第一个参数提供使用http核心模块完成请求把响应中每一个data事件的字符串内容各写在一行输出到控制台stdout程序需要能够通过learnyounode verify http-client.js的验证该命令写法见 exercises/http_client/problem.md。其中「每一个data事件写一行」是很容易被忽略的关键点它要求你不要聚合数据而是保持流式输出——每收到一块数据就立刻打印块与块之间换行分隔。这与后续 HTTP COLLECT 关卡「收集全部数据、统一输出两行」的要求形成鲜明对比。3. 使用 http 核心模块与 http.get() 快捷方法原文档提示本练习需要使用 Node.js 核心模块http对应仓库中随项目一起提供的 docs-nodejs/http.html 文档页面。引入模块的方式是const http require(http)发起请求时文档推荐使用http.get()——它是http.request()针对简单 GET 请求的快捷封装无需手动设置请求方法、也无需调用req.end()来结束请求。其调用形式为http.get(url, callback)第一个参数要请求的 URL 字符串第二个参数请求完成收到响应后触发的回调函数。从源码实现看官方参考解答正是直接用process.argv[2]取命令行第一个参数作为 URL// 仓库参考实现exercises/http_client/solution/solution.js use strict const http require(http) http.get(process.argv[2], function (response) { response.setEncoding(utf8) response.on(data, console.log) response.on(error, console.error) }).on(error, console.error)注意process.argv的索引规律argv[0]是 node 可执行文件路径argv[1]是脚本文件路径argv[2]起才是真正的用户参数因此 URL 取自process.argv[2]。4. 理解回调签名response 是一个 Node Stream原文档特别强调http.get()的回调签名与 Node.js 中常见的function (err, data)模式不同它的签名是function callback (response) { /* ... */ }回调只接收一个参数——response响应对象。这里有两个容易踩坑的点它没有err参数错误不会以第一个参数的形式传入回调而是通过事件error或请求对象上的监听器暴露response本质上是一个 NodeStream流对象不是一次性返回完整内容的普通数据对象。Stream 的含义在于响应数据是分块到达的你需要通过事件监听来消费它而不是拿到一个「完整响应体」。4.1 三个核心事件data、error、end原文档指出对 Node Stream 最值得关注的三个事件是事件触发时机典型用途data每接收到一块chunk可用数据时逐块处理响应内容error发生错误时捕获并报告异常end响应数据全部接收完毕时执行收尾逻辑监听事件的统一写法是.on(eventName, listener)response.on(data, function (data) { /* ... */ })关于data事件原文档明确指出data在一个数据块可用且可被处理时触发而每个块的大小取决于底层数据源。也就是说数据块的大小由网络传输、底层缓冲等因素决定不应假设每次data事件携带固定长度的数据。在 learnyounode 的测试服务器场景中这一点体现得尤为明显——见本文第 7 节的源码剖析。5. setEncoding(utf8)让 data 事件输出字符串而非 Buffer默认情况下data事件携带的数据是 Node 的Buffer对象二进制数据容器。如果你想直接得到字符串原文档给出了官方推荐做法调用response流对象上的setEncoding()方法response.setEncoding(utf8)调用setEncoding(utf8)之后data事件发出的将是String如果不调用你需要自己把Buffer显式转换为字符串例如data.toString()。这一点对本题至关重要因为任务要求「把每个data事件的字符串内容写一行到 stdout」——直接输出字符串最贴合要求也避免了每次手动toString()的样板代码。仓库参考实现solution.js和验证用测试文件test/http_client/valid_01.js都无一例外地在读取数据前先调用setEncoding(utf8)。6. 完整参考实现与代码走读综合原文档所有提示一份可直接通过验证的解答如下即仓库官方参考实现use strict const http require(http) http.get(process.argv[2], function (response) { response.setEncoding(utf8) response.on(data, console.log) response.on(error, console.error) }).on(error, console.error)逐行解读http.get(process.argv[2], callback)以命令行第一个参数为 URL 发起 GET 请求response.setEncoding(utf8)把数据编码设为 UTF-8使data事件回调收到的是字符串response.on(data, console.log)每收到一块数据就打印一行。console.log本身就是data事件的回调——因为事件回调只接收一个参数数据块与console.log的签名天然契合这正是官方解答用console.log直接当监听器的原因response.on(error, console.error)监听响应流上的错误.on(error, console.error)链式调用在http.get()返回的请求对象上监听请求对象上的错误例如 DNS 解析失败、连接被拒等请求阶段的异常——这是文档提示之外、参考实现主动补充的健壮性处理。与之对应的验证测试 test/http_client/valid_01.js 使用了同样的模式require(http).get(process.argv[2], processResponse)并将回调抽成具名函数说明这套「setEncoding data/error 监听」是 learnyounode 官方认可的通过标准。7. 从源码看懂验证机制测试服务器如何工作学完代码再来看这套练习背后的验证原理——learnyounode 会为你的提交程序启动一个本地 HTTP 测试服务器其实现位于 exercises/http_client/exercise.js。关键逻辑如下启动测试服务器exercise.js用http.createServer创建服务响应时把一组单词逐个写入每个单词之间用setTimeout延迟25ms形成典型的分块chunked响应——这正是上文所说「每个 data 块大小取决于底层数据源」的实锤10 个单词被拆成 10 个分块先后到达随机端口exercise.js服务器listen(0)监听随机空闲端口然后拼出http://localhost:port作为 URL把 URL 注入命令行参数exercise.jsthis.submissionArgs [url]与this.solutionArgs [url]——你的程序submission和官方解答solution会以该 URL 作为第一个命令行参数被分别启动这正是题目要求「URL 由命令行第一个参数提供」的由来数据来源lib/words.js单词来自boganipsum包boganipsum/clean_words经过随机排序后截取前 10 个构成响应的内容体清理exercise.js验证结束后关闭服务器。因此验证的判定逻辑本质上是把你的程序输出与官方解答在同样条件下同一测试服务器、同一 URL、同样的分块节奏的输出逐行比对。只要你的程序对每一个data事件各打印一行字符串输出顺序、行数就与官方解答一致从而通过验证。8. 运行与验证方式安装并启动 learnyounode 后安装方式详见 README.md即npm install -g learnyounode在终端选中 HTTP CLIENT 关卡进入练习。完成后用如下命令验证你的解答learnyounode verify http-client.js如果文件名不同把http-client.js替换为你的实际文件名例如node program.js本地自测或用learnyounode verify program.js提交验证。验证通过会显示 PASS失败则会提示输出差异。9. 知识点总结与延伸本关卡浓缩了三个值得长期留意的 Node.js 核心知识点http.get()是http.request()的 GET 快捷封装适合「只请求、不提交」的场景http.get()的回调参数是响应流Stream不是完整数据必须用data/error/end事件消费事件块的粒度由底层数据源决定不可预设setEncoding(utf8)是流式文本处理的惯用手段能让你免去手动Buffer转换。如果你已经完成本关下一关 exercises/http_collect/problem.pt-br.mdHTTP COLLECT将要求你聚合所有data数据后输出总字符数与完整内容——届时可对比体验「流式逐块输出」与「聚合后输出」两种截然不同的处理模式。赞分享教程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.get() 与 Stream 事件模型编写 HTTP 客户端learnyounode 实战用 http.get 与 Stream 事件模型编写 HTTP 客户端 本文以 learnyounode 课程第 7 个练习 H教程CLInextjs-use-php 对比 react-use-c 与 react-use-rust在 React 中嵌入多语言的 3 种思路nextjs use php 对比 react use c 与 react use rust在 React 中嵌入多语言的 3 种思路 nextjs use教程CLIlearnyounode HTTP CLIENT 练习详解用 Node.js 的 http.get() 编写第一个 HTTP GET 客户端learnyounode HTTP CLIENT 练习详解用 Node.js 的 http.get 编写第一个 HTTP GET 客户端 本指南围绕 lear教程CLI上一篇终极解析ViBidLAQA_base基于VietAI/vit5-base的法律领域AI模型原理下一篇【亲测免费】 探秘Univer一个开放源代码的全栈Web开发框架创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

TensorBoard 的 patch-package 依赖补丁机制:从 npm 补丁制作到 Bazel 构建期集成

TensorBoard 的 patch-package 依赖补丁机制:从 npm 补丁制作到 Bazel 构建期集成

数据可视化机器学习前端后端 【免费下载链接】tensorboard TensorFlows Visualization Toolkit 项目地址: https://gitcode.com/gh_mirrors/te/tensorboard 点击查看 免费下载 导读 本文围绕 TensorBoard 仓库中 patches/README.md 所描述的核心主题展开&#xff…

2026/9/30 6:54:53 阅读更多 →
一文读懂CXL 2.0协议:内存扩展、MLD与IDE避坑要点

一文读懂CXL 2.0协议:内存扩展、MLD与IDE避坑要点

简介:面向数据中心、高性能计算与异构加速领域的开发者和架构师,这份CXL 2.0协议规范中文版文档,系统阐述了Compute Express Link开放互连协议的核心设计。规范涵盖CPU、GPU、FPGA、ASIC等异构设备间的多用途互连、内存一致性语义、32 GT/s数…

2026/9/29 2:13:09 阅读更多 →
Redisson分布式锁原理详解:加锁、续期与解锁机制

Redisson分布式锁原理详解:加锁、续期与解锁机制

先聊个真实的场景。你负责的支付服务在做活动,库存只有100件,结果订单却生成了120个。排查下来发现不是数据库问题,而是三个应用实例同时读了库存、同时扣减、同时写回,典型的并发覆盖。单机上的synchronized或ReentrantLock&…

2026/9/29 2:13:09 阅读更多 →

最新新闻

MAS 激活:一条命令三分钟免费激活 Windows 和 Office

MAS 激活:一条命令三分钟免费激活 Windows 和 Office

MAS 激活:一条命令三分钟免费激活 Windows 和 Office 【免费下载链接】Microsoft-Activation-Scripts Open-source Windows and Office activator featuring HWID, Ohook, TSforge, and Online KMS activation methods, along with advanced troubleshooting. 项目…

2026/9/30 6:54:06 阅读更多 →
用 jobindex-cli 在丹麦 Jobindex.dk 上检索职位:一条命令完成搜索、详情抓取与 JSON 结构化输出

用 jobindex-cli 在丹麦 Jobindex.dk 上检索职位:一条命令完成搜索、详情抓取与 JSON 结构化输出

AI 应用AI 技能 【免费下载链接】ai-job-search The job search that runs on your machine. AI job application framework built on Claude Code: evaluate postings, tailor CVs, write cover letters, prep interviews. Fork it and own it. 项目地址: https://…

2026/9/30 6:54:06 阅读更多 →
ai-job-search 岗位评估框架实战指南:五维评分、硬性门槛与公司研究缓存机制

ai-job-search 岗位评估框架实战指南:五维评分、硬性门槛与公司研究缓存机制

AI 应用AI 技能 【免费下载链接】ai-job-search The job search that runs on your machine. AI job application framework built on Claude Code: evaluate postings, tailor CVs, write cover letters, prep interviews. Fork it and own it. 项目地址: https://…

2026/9/30 6:54:06 阅读更多 →
java-design-patterns 中的 Fluent Interface(流式接口)模式:用方法链构建可读、可维护的 Java API

java-design-patterns 中的 Fluent Interface(流式接口)模式:用方法链构建可读、可维护的 Java API

示例工程教程 【免费下载链接】java-design-patterns Design patterns implemented in Java 项目地址: https://gitcode.com/GitHub_Trending/ja/java-design-patterns 点击查看 免费下载 导读 本文以 java-design-patterns 仓库中的 fluent-interface 模块为依托…

2026/9/30 6:54:06 阅读更多 →
PhotoPrism 仓库提交规范实战指南:Commit 消息、GitHub Issue 与文档风格全解析

PhotoPrism 仓库提交规范实战指南:Commit 消息、GitHub Issue 与文档风格全解析

后端前端图像处理人工智能AI 应用 【免费下载链接】photoprism AI-Powered Photos App 🌈💎✨ 项目地址: https://gitcode.com/gh_mirrors/ph/photoprism 点击查看 免费下载 导读 本文以 PhotoPrism 仓库的 .claude/rules/commit-and-docs-…

2026/9/30 6:54:06 阅读更多 →
AI Agent 面试题 203:如何设计Agent的LLM调用链路追踪?

AI Agent 面试题 203:如何设计Agent的LLM调用链路追踪?

🔥 AI Agent 面试题 203:如何设计Agent的LLM调用链路追踪?摘要:本文深入解析了「如何设计Agent的LLM调用链路追踪?」这一 AI Agent 领域的核心面试题。文章从 多模型协同 的基本概念出发,系统性地剖析了 链…

2026/9/30 6:53:05 阅读更多 →

日新闻

Base64 图片头部特征识别:从文件头到格式判断的完整指南

Base64 图片头部特征识别:从文件头到格式判断的完整指南

1. 项目概述:为什么说看懂 base64 图片头部是基本功这几年跟 base64 打交道的机会越来越多,后端接口返回图片、前端渲染验证码、小程序里存小图、还有一些老系统导出报表,动不动就给你一段长到怀疑人生的 base64 字符串。很多人拿到字符串就直…

2026/9/30 0:00:35 阅读更多 →
Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

简介:本资源是一份面向Java初学者与课程设计学生的公交站牌广告灯箱管理系统毕业设计文档,聚焦城市公共广告资源信息化管理痛点,提供从需求分析到技术实现的完整方案。文档采用标准学术论文结构,含摘要、英文摘要、目录及五章正文…

2026/9/30 0:00:35 阅读更多 →
用 Redis Lua 构建大模型 API 多租户原子配额治理体系

用 Redis Lua 构建大模型 API 多租户原子配额治理体系

我去年年底接了一个内部 AI 平台的治理需求,背景很直接:公司把 DeepSeek、MiniMax 这类大模型 API 统一封装成内部网关,开放给几个业务团队用。结果第一个月账单出来,额度直接超了 4 倍。仔细查日志,发现原因并不复杂—…

2026/9/30 0:00:35 阅读更多 →

周新闻

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

如何划分训练/验证集: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/29 8:16:59 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

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

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

2026/9/29 16:41:41 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/29 8:24:48 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/29 19:29:29 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/29 5:58:00 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/29 3:55:56 阅读更多 →