NodeJS 如何保存我下载的文件使用fetch with fs

at0kjp5o  于 2022-12-12  发布在  Node.js
关注(0)|答案(2)|浏览(282)

我试着从github用fetch()函数下载文件。
然后,我尝试保存取回的文件流作为一个文件与fs模块.
在执行此操作时,我收到以下错误:
类型错误[错误_无效_参数_类型]:transform.writable”属性必须是WritableStream的示例。已收到WriteStream的示例
我的问题是,我不知道WriteStream和WritableStream之间的区别,也不知道如何转换它们。
下面是我运行的代码:

  1. async function downloadFile(link, filename = "download") {
  2. var response = await fetch(link);
  3. var body = await response.body;
  4. var filepath = "./" + filename;
  5. var download_write_stream = fs.createWriteStream(filepath);
  6. console.log(download_write_stream.writable);
  7. await body.pipeTo(download_write_stream);
  8. }

Node.js:v18.7.0

nc1teljy

nc1teljy1#

问得好。Web流是一种新的东西,它们是处理流的不同方式。WritableStream告诉我们,可以按如下方式创建WritableStreams

  1. import {
  2. WritableStream
  3. } from 'node:stream/web';
  4. const stream = new WritableStream({
  5. write(chunk) {
  6. console.log(chunk);
  7. }
  8. });

然后,您可以创建一个自定义流,将每个块写入磁盘。

  1. const download_write_stream = fs.createWriteStream('./the_path');
  2. const stream = new WritableStream({
  3. write(chunk) {
  4. download_write_stream.write(chunk);
  5. },
  6. });
  7. async function downloadFile(link, filename = 'download') {
  8. const response = await fetch(link);
  9. const body = await response.body;
  10. await body.pipeTo(stream);
  11. }
展开查看全部
uubf1zoe

uubf1zoe2#

您可以使用Readable.fromWebbody(来自web streams APIReadableStream)转换为可以与fs方法一起使用的NodeJS Readable流。
请注意,readable.pipe会立即返回另一个流。要等待它完成,可以使用stream.finished的承诺版本将其转换为Promise,或者可以为'finish''error'事件添加侦听器以检测成功或失败。

  1. const fs = require('fs');
  2. const { Readable } = require('stream');
  3. const { finished } = require('stream/promises');
  4. async function downloadFile(link, filepath = './download') {
  5. const response = await fetch(link);
  6. const body = Readable.fromWeb(response.body);
  7. const download_write_stream = fs.createWriteStream(filepath);
  8. await finished(body.pipe(download_write_stream));
  9. }

相关问题