尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

如何在 zx 中将 fetch 下载流直接管道到命令?

如何在 zx 中将 fetch 下载流直接管道到命令? 如何在 zx 中将 fetch 下载流直接管道到命令【免费下载链接】zxA tool for writing better scripts项目地址: https://gitcode.com/GitHub_Trending/zx/zx用 zxA tool for writing better scripts写下载类脚本时有一个常见的坑先fetch再用res.text()或res.json()处理会把整个响应体加载成字符串API 文档 明确指出当输出极大时可能超过字符串大小限制。为此 zx 给脚本内的fetch附加了pipe扩展让下载流直接接进命令的 stdin不必先把整个文件缓冲进内存。本文以「下载一个远端 package.json 并管道给命令处理」为例给出可运行的脚本和结果验证方式。环境与安装按 docs/setup.md运行 zx 脚本需要Linux、macOS 或 WindowsJavaScript 运行时Node.js 12.17.0另支持 Bun 1.0.0、Deno 1.x/2.x、GraalVM Node.jsbash 或 PowerShell。安装方式二选一npm install zx # add -g to install globally不想把 zx 装进项目依赖时可以直接运行npx zx script.js脚本文件约定见 docs/getting-started.md使用.mjs扩展名以启用顶层await文件开头加 shebang#!/usr/bin/env zx$、cd、fetch、echo等内置函数在脚本里开箱即用无需 import需要编辑器补全时可显式import zx/globals。保存后运行zx ./script.mjsfetch(...).pipe 的两种等价写法zx 脚本里的fetch是对 node-fetch-native 包的封装返回值除了是PromiseResponse还挂了一个pipe方法实现见 src/goods.ts。docs/api.md 给出的两种写法const p1 fetch(https://example.com).pipe($cat) const p2 fetch(https://example.com).pipecat两者的行为边界传入$模板字面量时返回ProcessPromiseawait后得到ProcessOutput可读stdout/stderr/exitCode模板字面量形式内部会以$({ halt: true, signal })创建目标进程因此整条管道可以作为单个单元等待且与.pipe($cat)产生相同的 stdout见 test/core.test.js 的测试断言目的地不是命令例如可写流时下载流会直接 pipe 进该流并返回目的地本身请求级signal会透传给被 pipe 的进程请求失败时目标进程会被 abort见 src/goods.ts。完整示例把下载的 package.json 管道给 cat下面的脚本沿用了项目测试中的 URL 与校验方式test/core.test.js下载 zx 主分支的package.json把下载流管道给cat再打印命令的 stdout#!/usr/bin/env zx const url https://raw.githubusercontent.com/google/zx/refs/heads/main/package.json const p fetch(url).pipe($cat) const { stdout } await p echo(stdout)保存为fetch-pipe.mjs后运行zx ./fetch-pipe.mjs模板字面量形式与上面的函数调用形式完全等价可以简写为const { stdout } await fetch(url).pipecat验证结果验证方式参照项目自身的测试断言test/core.test.js、test/goods.test.ts命令的 stdout 应包含name: zx——测试用assert.match(stdout, /name: zx/)校验说明下载流确实被完整送到了命令fetch(url)本身仍是可 await 的 Promise可单独检查 HTTP 状态例如测试中(await req).status为 200。stdout 包含预期内容即说明流管道工作正常。边界与注意事项大文件不要用text()/json()输出极大时可能超过字符串大小限制这正是pipe的适用场景docs/api.md目标命令非零退出与其他$进程一致目标命令返回非零退出码时await会抛出ProcessOutput需要自行处理退出码时目的地改用$({ nothrow: true })见 docs/api.md超时可给fetch传signal: AbortSignal.timeout(5000)docs/api.md 中的示例超时信号会沿 pipe 传给目标进程响应较小且只需要 JSON 时await res.json()更直接pipe面向的是大响应体或必须把流交给命令处理的场景。延伸下载接口不稳定时可用retry()包裹重试docs/api.md一个完整组合了fetch、超时与错误处理的脚本可参考 examples/fetch-weather.mjs。【免费下载链接】zxA tool for writing better scripts项目地址: https://gitcode.com/GitHub_Trending/zx/zx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表