新闻详情

新闻详情

首页 / 资讯中心 / 详情

learnyounode 练习五:filtered_ls 异步目录过滤实战指南

发布时间:2026/9/28 2:54:06来源:尧图网络
learnyounode 练习五:filtered_ls 异步目录过滤实战指南
教程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 开源练习项目中的filtered_ls一题展开讲解如何用 Node.js 的fs.readdir()与path.extname()实现按扩展名过滤目录文件列表并输出到控制台。读完本文你将掌握异步 I/O 读取目录的标准写法、命令行参数的获取方式以及 learnyounode 自动化验证verify的运行机制。题目要求过滤目录文件列表在 learnyounode 的第 5 个练习对应exercises/filtered_ls目录中你需要编写一个程序实现以下功能打印出指定目录下的文件列表按照特定的文件扩展名对列表进行过滤将过滤后的结果打印到终端每个文件占一行必须使用异步 I/O。程序运行时需要接收两个命令行参数第一个参数目录路径如/path/to/dir/第二个参数文件扩展名如txt。需要注意第二个参数不会自带前导点号.也就是说传入的是txt而不是.txt。但过滤条件要求文件以.txt结尾所以需要在代码中自行拼接点号。filtered_ls完整的题目原文位于 problem.pl.md波兰语版以及 problem.md英文版各语言版本如 problem.zh-cn.md内容完全一致。核心 APIfs.readdir 与 path.extnamefs.readdir(pathname, callback)fs.readdir()是 Node.jsfs模块提供的异步读取目录内容的方法它接收两个参数第一个参数目录路径pathname第二个参数回调函数 callback。回调函数签名为function callback (err, list) { /* ... */ }其中list是一个数组数组中的每个元素是该目录下的文件名字符串形式。完整 API 文档见仓库内的 docs-nodejs/fs.html。path.extname(path)path模块的extname方法可以返回一个路径或文件名的扩展名部分例如path.extname(index.html)返回.html。它的返回值包含前导点号这正是与命令行第二个参数需要互补的地方。path模块完整文档见 docs-nodejs/path.html。官方参考实现exercises/filtered_ls/solution/solution.js是本题的官方参考实现use strict const fs require(fs) const path require(path) const folder process.argv[2] const ext . process.argv[3] fs.readdir(folder, function (err, files) { if (err) return console.error(err) files.forEach(function (file) { if (path.extname(file) ext) { console.log(file) } }) })这个实现展示了几个关键点参数获取process.argv[2]取目录process.argv[3]取扩展名。注意process.argv的前两个元素是 Node 运行时保留的系统信息可执行文件路径与脚本路径所以程序参数的起点是下标 2。扩展名拼接const ext . process.argv[3]将第二个参数补上点号与path.extname()的返回值格式对齐。异步回调fs.readdir(folder, callback)在回调中统一处理结果与错误。逐行输出console.log(file)天然在每条文件名后追加换行符满足一个文件一行的要求。另一种等价写法filter 链式调用test/filtered_ls/valid_01.js给出了一个用Array.prototype.filter实现的等价答案const fs require(fs) const path require(path) fs.readdir(process.argv[2], function (err, list) { if (err) { console.log(err) } list.filter(function (file) { return path.extname(file) . process.argv[3] }).forEach(function (file) { console.log(file) }) })两种写法思路一致先readdir拿到完整文件列表再用path.extname(file) . ext做精确匹配。区别只在于官方解法用forEach内嵌if而测试用例用filter生成新数组。易错点同步 I/O 会导致验证失败题目明确要求必须使用异步 I/O。test/filtered_ls/invalid_01.js展示了典型的反例——使用同步 APIconst list fs.readdirSync(process.argv[2])learnyounode 的验证机制见exercises/filtered_ls/exercise.js会在子进程内通过exercises/my_first_io/wrap.js包装所有 fs 方法记录用户实际调用了哪些 API。exercise.addVerifyProcessor中的校验逻辑如下若检测到任何以Sync结尾的调用如readdirSync判定 FAIL若检测到异步调用如readdir判定 PASS若两者都没有检测到即根本没调用 fs 模块同样判定 FAIL这是 nodeschool 社区的已知边界情况见 exercise.js 中引用的 GitHub issue 讨论。因此即便readdirSync能输出同样的结果也会因为使用了同步 I/O而无法通过验证。另一个反例是test/filtered_ls/invalid_02.js它通过child_process.exec(ls -1 ...)调用系统命令来列目录。从wrap.js的源码看它只包装fs、fs.promises与util的调用不会记录exec——这同样无法满足使用fs.readdir()异步 I/O的考察目标。验证机制与自动化测试运行时如何构造测试数据exercises/filtered_ls/exercise.js在运行前会在系统临时目录下创建_learnyounode_pid测试目录使用os.tmpdir()与当前进程 pid 保证唯一性依据 file-list.json 中预置的 15 个文件名如learnyounode.dat、learnyounode.txt、README.md、w00t.txt、data.json等逐一写入测试文件内容为nothing to see here通过submissionArgs.unshift(md)与unshift(testDir)把目录路径与扩展名md注入被验证程序的命令行参数中。也就是说实际验证时你的程序会收到testDir和md两个参数只有扩展名为.md的文件例如README.md应被输出。verify 命令编写好filtered-ls.js后通过以下命令验证$ learnyounode verify filtered-ls.js根据 README.md 的使用说明learnyounode verify只会验证当前选中的练习对应的预期输出如果想在验证前查看题目说明可以先运行learnyounode用方向键与回车选中练习。验证通过会显示 PASS失败则会输出 FAIL 及失败原因例如提示使用了fs.readdirSync()。动手实验完整的实战流程安装 learnyounode 并启动运行learnyounode在课程列表中选择FILTERED LS练习进入后终端会打印本题的说明与提示。创建filtered-ls.js写入官方参考实现或你自己的异步写法。先用 Node 直接自测需要先准备测试目录与文件例如$ mkdir -p /tmp/filter-test $ touch /tmp/filter-test/a.txt /tmp/filter-test/b.md /tmp/filter-test/c.json $ node filtered-ls.js /tmp/filter-test txt预期输出为a.txt一行。 4. 运行learnyounode verify filtered-ls.js提交验证观察 PASS/FAIL 结果。小结filtered_ls练习的核心目标有三一是掌握fs.readdir()的异步回调用法二是理解process.argv的参数下标规则前两项为系统信息三是学会用path.extname()精确匹配扩展名。配套的验证机制exercise.js 与 wrap.js会强制检查 fs 调用的同步/异步属性确保学习者真正用异步 I/O 完成目录读取——这也是本题区别于my_first_io同步读取文件和my_first_async_io异步读取文件的关键考察点。赞分享教程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点击查看免费下载相关推荐掌握Node.js命令行参数learnyounode Baby Steps练习详解掌握Node.js命令行参数learnyounode Baby Steps练习详解 想要快速掌握Node.js命令行参数处理技巧吗learnyounode的教程CLILearnYouNode 教程模块化文件过滤程序开发指南LearnYouNode 教程模块化文件过滤程序开发指南 痛点为什么需要模块化开发 你是否曾经遇到过这样的场景代码越写越长功能越来越复杂维护起来越来教程CLISwiftCrossUI 项目常见问题解决方案SwiftCrossUI 项目常见问题解决方案 SwiftCrossUI 是一个开源项目旨在提供一个跨平台的声明式 UI 框架灵感来自于 SwiftUI。该教程CLI上一篇OBS Studio 模块ModuleAPI 参考libobs 插件的声明、导出与加载全解下一篇70亿参数引爆企业智能新纪元IBM Granite-4.0-H-Tiny轻量化部署实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Harness Handbook 实战:用 TaoToken 统一 Key 让 Agent Harness 可读可查可改 2026/9/28 4:01:43

Harness Handbook 实战:用 TaoToken 统一 Key 让 Agent Harness 可读可查可改

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Flutter 三方库 dart_amqp_client 鸿蒙适配指南:TaoToken 统一 Key 打通 OpenHarmony 工业级 AMQP 消息队列通讯 2026/9/28 4:01:43

Flutter 三方库 dart_amqp_client 鸿蒙适配指南:TaoToken 统一 Key 打通 OpenHarmony 工业级 AMQP 消息队列通讯

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
问答型内容到底是什么?一次讲清楚 2026/9/28 4:01:43

问答型内容到底是什么?一次讲清楚

问答型内容到底是什么?一次讲清楚 核心摘要- 问答型内容在生成式引擎优化(GEO)中具有独特价值,是中国生成式人工智能用户规模达6.02亿人的重要信息来源。- 覆盖27个省级行政区的285个典型案例表明,问答型内容能直接带动…

阅读更多 →
Ethan开发者创新项目日报 | 2025-09-03:用 TaoToken 统一 Key 打通 Cline 与 CC Switch 配置 2026/9/28 4:01:43

Ethan开发者创新项目日报 | 2025-09-03:用 TaoToken 统一 Key 打通 Cline 与 CC Switch 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
mongoose 7.2 HTTPS TLS 握手失败排查:从 SSL_accept 报错到 config.toml 骨架 2026/9/28 4:01:43

mongoose 7.2 HTTPS TLS 握手失败排查:从 SSL_accept 报错到 config.toml 骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
百度“龙虾”全家桶亮相,多款龙虾产品上新,家用小度虾也来了:TaoToken 统一 Key 接入小度虾配置骨架 2026/9/28 4:01:37

百度“龙虾”全家桶亮相,多款龙虾产品上新,家用小度虾也来了:TaoToken 统一 Key 接入小度虾配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉