当 Axios 用 responseType: 'stream' 解析 Node 请求时,响应体已经可以消费,但文件尚未写完。请等待传输写入目标:

import { createWriteStream } from 'node:fs';
import { pipeline } from 'node:stream/promises';

const response = await client.get(url, { responseType: 'stream' });
await pipeline(response.data, createWriteStream(partPath));

这里使用的是已经配置好的客户端。它的适配器必须支持所选的代理或 SOCKS 代理;Axios 内置的 HTTP 代理选项与 SOCKS 代理是两套独立机制。URL、超时和取消策略由应用提供。

请使用属于本次操作的临时路径。在创建写入流之前先决定如何处理冲突,这样失败后的清理不会删掉别人的文件。有意的断点续传需要自己的策略。

pipeline 协调读取与写入,并报告它们的失败。调用 response.data.pipe(file) 后立刻记录成功,就跳过了那个完成点。有效的 HTTP 响应到达之后也可能发生网络中断或磁盘写满;请保留响应上下文以及让流水线停止的错误。

等待的流水线成功后,执行应用的产物检查,然后再发布最终文件名。完成意味着流已在上述 API 下被消费并写入,并不代表它就是预期的发行版或文档。失败或取消时,按选定的续传策略保留或删除部分文件。取消信号可以停止相关请求与流操作,但它不决定应用该如何处理输出。

相关文章