113 votes

Node.js ne peut pas créer de Blobs ?

Je travaille avec node.js et j'ai diffusé mon audio sur mon serveur node.js. Maintenant, j'ai remarqué que pendant le processus de construction du blob audio :

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

Que j'obtienne une ReferenceError à new Blob. Il semble que le Blob ne soit pas pris en charge. Comment puis-je créer un blob que je voudrais sauvegarder avec le module fs de node.js.

Merci les gars !

41voto

zer02 Points 1369

La solution à ce problème est de créer une fonction qui peut convertir les tampons de tableaux en tampons de nœuds :)

Convertir un Buffer NodeJS binaire en ArrayBuffer JavaScript

Dans les versions récentes du nœud, c'est juste :

let buffer = Buffer.from(arraybuffer);
let arraybuffer = Uint8Array.from(buffer).buffer;

26voto

Richie Bendall Points 1694

Depuis Node.js 16, Blob peuvent être importés :

import {Blob} from 'node:buffer';

new Blob([]);
//=> Blob {size: 0, type: ''}

Sinon, il suffit d'utiliser 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;

5voto

Maxime Lafarie Points 886
Note : Cette réponse ne s'applique que si vous voulez suivre la réponse de Richie Bendall.

Réponse courte :

Évitez d'importer Blob de 'node:buffer' .

Au lieu de cela, préférez l'importer de la manière suivante (comme expliqué dans le document Documentation sur NodeJS . (exemple de mise en œuvre ici )) :

import { Blob } from 'buffer';

Longue réponse :

La réponse de Richie Bendall m'a beaucoup aidé. Mais il semble que l'importation Blob de node:buffer casse les tests unitaires de Jest, en lançant cette erreur :

 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)

Au lieu d'essayer de se moquer de la node:buffer avec du code bizarre/tricky, j'ai jeté un coup d'oeil aux exemples de la documentation NodeJS. Ainsi, il est démontré que Blob peut être importé à partir de 'buffer'

import { Blob } from 'buffer';

// ...

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

Et toutes les erreurs de Jest ont été supprimées !

-1voto

Rooster Points 15

Une autre solution à envisager est d'utiliser un Chaîne en base64 pour transférer les données du serveur au client.

Je travaille sur un projet Node.js où je reçois des données audio sous la forme d'un ArrayBuffer, et je veux envoyer et lire ces données dans le navigateur. La plupart de mes difficultés proviennent du fait que j'essaie d'envoyer le ArrayBuffer au client ou de convertir le ArrayBuffer et d'envoyer un Buffer.

Ce qui s'est avéré être une solution simple pour moi a été de

  1. Convertir le ArrayBuffer en une chaîne encodée en base64 sur le serveur.
  2. Renvoyer/envoyer la chaîne Base64 au client depuis le serveur
  3. Créez un élément/objet Audio du côté client et jouez le son.

J'ai utilisé base64-arraybuffer pour effectuer la conversion ArrayBuffer > Base64 String (bien qu'il puisse être simple de le faire sans paquet).

J'ai utilisé les conseils de ici pour créer l'élément audio du côté client.

*Je n'ai pas beaucoup testé les limites, donc je ne sais pas comment cela pourrait gérer les gros fichiers audio.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X