109

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

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

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

多谢你们!

4

5 回答 5

41

解决这个问题的方法是创建一个可以在 Array Buffers 和 Node Buffers 之间转换的函数。:)

将二进制 NodeJS 缓冲区转换为 JavaScript ArrayBuffer

在最近的节点版本中,它只是:

let buffer = Buffer.from(arraybuffer);
let arraybuffer = Uint8Array.from(buffer).buffer;
于 2013-02-06T19:43:23.667 回答
23

从 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;
于 2019-11-16T23:35:35.140 回答
4
注意:此答案仅适用于您想遵循 Richie Bendall 的答案。

简短的回答:

避免Blob'node:buffer'.

相反,更喜欢像这样导入它(如NodeJS 文档中所述。(此处的实现示例)):

import { Blob } from 'buffer';

长答案:

Richie Bendall 的回答对我帮助很大。但似乎Blobnode:buffer中断 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 文档示例。所以它表明Blob可以从'buffer'

import { Blob } from 'buffer';

// ...

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

所有 Jest 错误都已消失!

于 2021-08-30T10:28:46.707 回答
0

另一个要考虑的解决方案是使用Base64 字符串将数据从服务器传输到客户端。

我正在开发一个 Node.js 项目,在该项目中我以 ArrayBuffer 的形式接收音频数据,并且我想在浏览器中发送和播放该数据。我的大部分挣扎来自尝试将 ArrayBuffer 发送到客户端或尝试转换 ArrayBuffer 并发送 Buffer。

最终对我来说是一个简单的解决方案是

  1. 在服务器上将 ArrayBuffer 转换为 Base64 编码的字符串
  2. 从服务器返回/发送 Base64 字符串到客户端
  3. 在客户端创建一个音频元素/对象并播放声音

我使用base64-arraybuffer来执行 ArrayBuffer > Base64 String 转换(不过,在没有包的情况下执行此操作可能很简单)。

我使用此处的提示在客户端创建音频元素。

*我在测试限制方面没有做太多 - 所以我不知道这如何处理大型音频文件。

于 2020-05-01T18:40:22.277 回答
-4

作为建议,您可能想阅读以下内容:http: //howtonode.org/really-simple-file-uploads

我的意思是我想我不知道你想做什么。可能没有用于 blob 的模块,但是如果您只想将某些内容写入磁盘,则可以使用 fs 模块.. 此代码不能直接工作,但是..

var fs = require('fs')
  , express = require('express')

app.post('/upload', function (req, res) {
  // asynch call to write file to disk
  fs.write("/tmp/file.mp3", req.params.body, function (err) {
    if (err) console.log(err)
  });
  res.end();
});

只需将 mp3 或其他任何内容发布到 /upload,它就会将其写入磁盘。你可以做任何你想做的验证。

于 2013-02-01T19:31:34.480 回答