[英]Node.js can't create Blobs?
我正在使用 node.js 並將我的音頻流式傳輸到我的 node.js 服務器。 現在我在構建音頻 blob 的過程中注意到:
var audioBlob = new Blob([dataview], { type: 'audio/wav' });
我在新的 Blob 處收到 ReferenceError。 似乎不支持 Blob。 如何創建一個我想用 node.js fs 模塊保存的 blob?
解決這個問題的方法是創建一個可以在 Array Buffers 和 Node Buffers 之間轉換的函數。 :)
將二進制 NodeJS 緩沖區轉換為 JavaScript ArrayBuffer
在最近的節點版本中,它只是:
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;
注意:此答案僅適用於您想遵循 Richie Bendall 的答案。
避免從'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 文檔示例。 所以它表明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 錯誤都已消失!
您可以嘗試使用來自“流”節點 api 的Readable.from(value.buffer)
。
它解決了我要發送的 FormData append 文件。
另一個要考慮的解決方案是使用Base64 字符串將數據從服務器傳輸到客戶端。
我正在開發一個 Node.js 項目,在該項目中我以 ArrayBuffer 的形式接收音頻數據,並且我想在瀏覽器中發送和播放該數據。 我的大部分掙扎來自嘗試將 ArrayBuffer 發送到客戶端或嘗試轉換 ArrayBuffer 並發送 Buffer。
最終對我來說是一個簡單的解決方案是
我使用base64-arraybuffer來執行 ArrayBuffer > Base64 String 轉換(不過,在沒有包的情況下執行此操作可能很簡單)。
我使用此處的提示在客戶端創建音頻元素。
*我在測試限制方面沒有做太多 - 所以我不知道這如何處理大型音頻文件。
作為建議,您可能需要閱讀以下內容: 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,它就會將其寫入磁盤。 你可以做任何你想做的驗證。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.