簡體   English   中英

Node.js 無法創建 Blob?

[英]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。

最終對我來說是一個簡單的解決方案是

  1. 在服務器上將 ArrayBuffer 轉換為 Base64 編碼的字符串
  2. 從服務器返回/發送 Base64 字符串到客戶端
  3. 在客戶端創建一個音頻元素/對象並播放聲音

我使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM