Создание и сохранение Blob в Node.js: обход ReferenceError

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для работы с бинарными данными в Node.js используйте класс Buffer:

JS
Скопировать код
// Создаём Buffer с текстом "Привет, Buffer!"
const buffer = Buffer.from('Привет, Buffer!', 'utf-8');

Если вам необходим объект Blob, можно воспользоваться библиотекой buffer:

JS
Скопировать код
const { Blob } = require('buffer');
// Готово! Теперь у вас есть Blob!
const blob = new Blob([buffer], { type: 'application/octet-stream' });

Buffer захватил мир Node.js, так что использование полифила Blob помогает улучшить совместимость кода, предназначенного для браузеров.

Кинга Идем в IT: пошаговый план для смены профессии

Эмуляция Blob в Node.js до версии 16

В версии Node.js 16 появилась встроенная поддержка Blob, что стало отличной новостью. Однако для более ранних версий Node.js можно использовать такие пакеты, как cross-blob:

JS
Скопировать код
const Blob = require('cross-blob');
const blob = new Blob(['Используем Blob в Node.js и это удивительно!'], { type: 'text/plain' });

Благодаря cross-blob, создание Blob теперь столь же просто, как в браузере.

Работа с бинарными данными при помощи Buffer и fs

Buffer — это универсальный инструмент для работы с бинарными данными в Node.js. Когда дело доходит до файлов или потоковых данных, например, аудио в формате WAV, Buffer в сочетании с модулем fs показывает отличные результаты:

JS
Скопировать код
const fs = require('fs');
const buffer = Buffer.from(audioData);

fs.writeFile('audio.wav', buffer, (err) => {
  if (err) throw err;
  console.log('Аудио данные успешно записаны. Можно наслаждаться музыкой!');
});

Этот подход прост в реализации и эффективен.

Использование Blob при модульном тестировании

Во время модульного тестирования с помощью Jest, возможно потребуется работа с Blob. На этот случай есть такое решение:

JS
Скопировать код
const { Blob } = require('buffer');

test('Проверка создания Blob', () => {
  const testData = 'Привет, Blob!';
  const blob = new Blob([testData], { type: 'text/plain' });
  
  // Можно продолжать тестирование.
});

Визуализация

Попытка использовать Blob в Node.js чем-то напоминает попытку наполнить ведро дымом. Это просто не то. Здесь требуется другой подход. Давайте посмотрим на разницу между созданием Blob в Node.js и браузере:

Markdown
Скопировать код
Среда Node.js           | Попытка создания Blob       | Приемлемо?
------------------------|-----------------------------|-------------
JavaScript (Backend)    | new Blob(...)               | 📦❌

Node.js: "Так, попробуем создать Blob!"

JS
Скопировать код
  const blob = new Blob(['text'], {type: 'text/plain'}); // 🚫 Ошибка!

Реальность: "Blob здесь не работает!"

Markdown
Скопировать код
В Node.js:         🚫☁️
В браузере:       ✅☁️

Мы быстро осознаём, что в Node.js Blob по умолчанию не поддерживается. Здесь испольузется Buffer.

Markdown
Скопировать код
Правильный инструмент в Node.js: Buffer
====================================
const buffer = Buffer.from('text', 'utf-8'); // ✅ Buffer – наш выбор!

Обмен данными между Node.js и браузером

Если вы разрабатываете код для Node.js и браузера одновременно, вам не удастся игнорировать Blob. Здесь на помощь придут полифиллы:

JS
Скопировать код
// Встречайте полифилл, который делает Blob совместимым с Node.js.
globalThis.Blob = require('cross-blob');

Таким образом, мы можем говорить о Blob в контексте как Node.js, так и браузера. И всегда выбирайте соответствующий MIME-тип при создании Blob:

JS
Скопировать код
const blob = new Blob(['Привет, Blob!'], { type: 'application/json' });

Полезные материалы

  1. Blob – Веб API | MDN — Подробное объяснение работы с объектом Blob в контексте веб-разработки.
  2. Buffer | Документация Node.js — Руководство по использованию Buffer в Node.js для работы с бинарными данными.
  3. Файловая система | Документация Node.js — Руководство по использованию модуля файловой системы Node.js для работы с файлами и Blob.
  4. blob – npm — NPM-пакет, обеспечивающий работу с Blob в серверном JavaScript.
  5. blob-polyfill – npm — Полифилл, обеспечивающий поддержку Blob в Node.js.
  6. fetch-blob – npm — Пакет для использования Blob вместе с функцией fetch в Node.js, обеспечивающий совместимость с современными веб-API.
  7. Понимание потоков в Node.js – NodeSource — Статья о потоках в Node.js, актуальная при работе с Blob и бинарными данными.