109

node.jsを使用していて、オーディオをnode.jsサーバーにストリーミングしました。今、私はオーディオブロブを構築する過程で気づきました:

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

新しいBlobでReferenceErrorが発生すること。Blobはサポートされていないようです。node.jsfsモジュールで保存したいblobを作成するにはどうすればよいですか。

みんなありがとう!

4

5 に答える 5

41

この問題の解決策は、配列バッファーとノードバッファーの間で変換できる関数を作成することです。:)

バイナリNodeJSバッファーをJavaScriptArrayBufferに変換します

最近のノードバージョンでは、次のようになっています。

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
注:この回答は、RichieBendallの回答に従う場合にのみ適用されます。

短い答え:

Blobからのインポートは避けてください'node:buffer'

代わりに、次のようにインポートすることをお勧めします( NodeJSドキュメントで説明されています。(実装例はこちら)):

import { Blob } from 'buffer';

長い答え:

リッチー・ベンダルの答えは私を大いに助けてくれました。Blobしかし、からインポートnode: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

考慮すべきもう1つの解決策は、Base64文字列を使用してサーバーからクライアントにデータを転送することです。

ArrayBufferの形式でオーディオデータを受信するNode.jsプロジェクトに取り組んでおり、そのデータをブラウザーで送信して再生したいと考えています。私の苦労のほとんどは、ArrayBufferをクライアントに送信しようとしたり、ArrayBufferを変換してBufferを送信しようとしたりしたことによるものです。

私にとって単純な解決策になったのは、

  1. サーバー上でArrayBufferをBase64でエンコードされた文字列に変換します
  2. サーバーからクライアントにBase64文字列を返す/送信する
  3. クライアント側でオーディオ要素/オブジェクトを作成し、サウンドを再生します

base64-arraybufferを使用してArrayBuffer>Base64文字列変換を実行しました(ただし、パッケージなしでこれを実行するのは簡単かもしれません)。

ここからのヒントを使用して、クライアント側でオーディオ要素を作成しました。

*制限のテストについてはあまり行っていません。そのため、これが大きなオーディオファイルをどのように処理するかわかりません。

于 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 に答える