【问题标题】:Passing uint8array to function将 uint8array 传递给函数
【发布时间】:2020-12-11 13:24:31
【问题描述】:

我正在尝试使用 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的正确方法是什么?

谢谢。

【问题讨论】:

  • page 是什么,你用的是什么框架?你有没有调试过value到底是什么对象?
  • @Bergi,我刚刚更新了这个问题。值为Uint8Array 对象,我正在使用node.js
  • @opensource-developer 很明显,您使用 nodejs 从您使用的标签运行此代码,但 page(尤其是它的方法)是什么或它来自什么库仍然缺失.另外,您如何检查该对象的类型,以及您使用的是哪个控制台?
  • @Bergi,我的错,再次更新了问题,希望现在有相关信息:P
  • 啊,我怀疑是这样的。我很确定问题是您将在浏览器领域中创建的Uint8Array 传递给需要来自nodejs 领域的Uint8Array 的函数。唯一我不太明白为什么它不能将其识别为类似数组的对象。

标签: javascript node.js puppeteer uint8array


【解决方案1】:

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

如果传递给page.evaluate 的函数返回非Serializable 值,则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-05-12
  • 2020-07-28
  • 2013-01-27
  • 2014-09-10
  • 2013-01-10
  • 2010-11-01
  • 2016-04-27
  • 2014-04-10
  • 2012-05-07
相关资源
最近更新 更多