0

我正在尝试使用 fetch api 和可读流生成一个 excel 文件。我试图传递Uint8Array我从中获取reader.read()并从中创建一个缓冲区对象并将其传递给我的可写流,但是当我将数组传递给Buffer.from我时出现错误

The first argument must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object. Received an instance of Object

以下是我的代码的相关部分。

我正在使用node.js&我在控制台中检查了typeof valueUint8Array

这里的页面是

    const page = await browser.newPage(); //puppeter
let fn = `writeToStream_${Date.now()}`;
await page.exposeFunction(fn, async (body, done) => {
 let buffer = Buffer.from(body);
 await writeStream.write(buffer);
});

const fetchDataResp = await page.evaluate(async (fn, fetchUrl) => {
 const fetchPromise = fetch(fetchUrl);
 const stream = await fetchPromise;
 let reader = stream.body.getReader();
 const decoder = new TextDecoder();
 while(true) {
  const {done, value} = await reader.read();
  if (done){
   break;
  }
  await window[fn](value, false);
 }
 await window[fn]("", true);
},fn,fetchUrl);

传递 Uint8Array 的正确方法是什么?

谢谢。

4

1 回答 1

1

我认为这是由于序列化问题。如中所述page.evaluate()

如果传递给 的函数page.evaluate返回一个不可序列化的值,则page.evaluate解析为undefined. DevTools 协议还支持传输一些无法通过JSON: -0NaNInfinity-Infinity和 bigint 文字序列化的附加值。

类型化数组似乎被序列化为对象:

console.log(JSON.stringify(new Uint8Array([11, 12, 13])));
// {"0":11,"1":12,"2":13}

您可以尝试将类型化数组作为普通数组传输,然后重新转换它们:

import puppeteer from 'puppeteer';

const browser = await puppeteer.launch();

try {
  const [page] = await browser.pages();

  await page.goto('https://example.org/');

  const data = await page.evaluate(() => {
    return Array.from(new Uint8Array([11, 12, 13]));
  });
  console.log(new Uint8Array(data));
} catch(err) { console.error(err); } finally { await browser.close(); }
于 2020-12-11T16:55:22.847 回答