javascript Node.js不能创建Blob?

czq61nw1  于 2023-01-04  发布在  Java
关注(0)|答案(5)|浏览(354)

我正在使用node.js,我把我的音频流传输到我的node.js服务器。现在我注意到在构建音频blob的过程中:

var audioBlob = new Blob([dataview], { type: 'audio/wav' });

我在新的Blob上得到一个ReferenceError。似乎Blob不受支持。我如何创建一个我想用node.js fs模块保存的Blob?

ff29svar

ff29svar1#

这个问题的解决方案是创建一个函数,可以在数组缓冲区和节点缓冲区之间转换。:)
Convert a binary NodeJS Buffer to JavaScript ArrayBuffer
在最近的节点版本中,它只是:

let buffer = Buffer.from(arraybuffer);
let arraybuffer = Uint8Array.from(buffer).buffer;
0g0grzrc

0g0grzrc2#

由于Node.js 16,Blob可以导入:

import {Blob} from 'node:buffer';

new Blob([]);
//=> Blob {size: 0, type: ''}

否则,只需使用cross-blob

import Blob from 'cross-blob';
 
new Blob([]);
//=> Blob {size: 0, type: ''}
 
// Global patch (to support external modules like is-blob).
globalThis.Blob = Blob;
ar7v8xwq

ar7v8xwq3#

* 注意:这个答案只适用于你想遵循里奇·本德尔的答案的情况。

简短回答:

避免从'node:buffer'导入Blob

相反,更喜欢像这样导入它(如NodeJS文档中所解释的那样。(这里是实现示例)):

import { Blob } from 'buffer';

详细答案:

Richie Bendall的回答帮了我很大的忙,但是从node:buffer导入Blob似乎会破坏Jest单元测试,并抛出以下错误:

FAIL  dist/tests/unit/users/getOneById.spec.js
  ● Test suite failed to run

    ENOENT: no such file or directory, open 'node:buffer'

      2 | import config from '../config/config';
      3 | import { getFileExt, getFileName, removeFile } from './file';
    > 4 | import { Blob } from 'node:buffer';
        | ^
      5 |
      6 | class PdfHelpers {
      7 |

      at Runtime.readFile (node_modules/jest-runtime/build/index.js:2118:21)
      at Object.<anonymous> (src/helpers/pdf.ts:4:1)

我没有尝试用一些奇怪的代码来模拟node:buffer导入,而是查看了NodeJS文档示例,它演示了可以从'buffer'导入Blob

import { Blob } from 'buffer';

// ...

// Only the import is changing, don't change your existing implementation
const blob = new Blob([buf], { type: 'application/pdf' });

所有的玩笑错误都消失了!

gcxthw6b

gcxthw6b4#

您可以尝试使用“流”节点API中的Readable.from(value.buffer)
它解决了我对FormData附加文件发送。

c2e8gylq

c2e8gylq5#

要考虑的另一个解决方案是使用Base64 String将数据从服务器传输到客户端。
我正在做一个Node.js项目,在这个项目中我接收到ArrayBuffer形式的音频数据,我想在浏览器中发送和播放这些数据。我的大部分困难来自于尝试将ArrayBuffer发送到客户端,或者尝试转换ArrayBuffer并发送一个Buffer。
对我来说最后一个简单的解决方案是
1.在服务器上将ArrayBuffer转换为Base64编码的字符串
1.将Base64字符串从服务器返回/发送到客户端
1.在客户端创建Audio元素/对象并播放声音
我使用base64-arraybuffer来执行ArrayBuffer〉Base64字符串转换(不过,不用包也可以很简单地完成)。
我使用here中的技巧在客户端创建音频元素。

  • 我还没有做太多的方式测试限制-所以我不知道这可能如何处理大型音频文件。

相关问题