node.jsを使用していて、オーディオをnode.jsサーバーにストリーミングしました。今、私はオーディオブロブを構築する過程で気づきました:
var audioBlob = new Blob([dataview], { type: 'audio/wav' });
新しいBlobでReferenceErrorが発生すること。Blobはサポートされていないようです。node.jsfsモジュールで保存したいblobを作成するにはどうすればよいですか。
みんなありがとう!
node.jsを使用していて、オーディオをnode.jsサーバーにストリーミングしました。今、私はオーディオブロブを構築する過程で気づきました:
var audioBlob = new Blob([dataview], { type: 'audio/wav' });
新しいBlobでReferenceErrorが発生すること。Blobはサポートされていないようです。node.jsfsモジュールで保存したいblobを作成するにはどうすればよいですか。
みんなありがとう!
この問題の解決策は、配列バッファーとノードバッファーの間で変換できる関数を作成することです。:)
バイナリNodeJSバッファーをJavaScriptArrayBufferに変換します
最近のノードバージョンでは、次のようになっています。
let buffer = Buffer.from(arraybuffer);
let arraybuffer = Uint8Array.from(buffer).buffer;
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;
注:この回答は、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エラーがなくなりました!
考慮すべきもう1つの解決策は、Base64文字列を使用してサーバーからクライアントにデータを転送することです。
ArrayBufferの形式でオーディオデータを受信するNode.jsプロジェクトに取り組んでおり、そのデータをブラウザーで送信して再生したいと考えています。私の苦労のほとんどは、ArrayBufferをクライアントに送信しようとしたり、ArrayBufferを変換してBufferを送信しようとしたりしたことによるものです。
私にとって単純な解決策になったのは、
base64-arraybufferを使用してArrayBuffer>Base64文字列変換を実行しました(ただし、パッケージなしでこれを実行するのは簡単かもしれません)。
ここからのヒントを使用して、クライアント側でオーディオ要素を作成しました。
*制限のテストについてはあまり行っていません。そのため、これが大きなオーディオファイルをどのように処理するかわかりません。
提案として、これを読むことをお勧めします: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に投稿するだけで、ディスクに書き込まれます。必要な検証を行うことができます。