Executando verificação de segurança...
5

Buffers em Node.js

Introdução ao Buffer em Node.js

O Buffer é um objeto nativo do Node.js que permite trabalhar com dados binários de maneira eficiente, ele representa um pedaço de memória de tamanho fixo, você pode pensar em um buffer como um array de inteiros, em que cada unidade representa um byte de dados, ele é muito útil para manipular arquivos, imagens, vídeos e outros tipos de dados.

Tá mais onde Buffers são usados na prática?

Buffers está relacionado a Streams, por exemplo quando você precisa ler arquivo gigantesco, você normalmente quebra esse arquivo em chunks e vai processando ele acada chunk que chega, ai está essas chucks são gerenciadas pelo buffer, veja mais

Outro exemplo é quando você está assistindo um vídeo no Youtube e você pula para o final do vídeo você está baixando dados mais rápido do que está os vendo, e o seu browser os bufferiza, ou seja ele não precisa baixar o vídeo todo para ter amostrar aquele momento no vídeo, ele apenas pega o aquele pedaço e reproduz.

buffer example

Métodos úteis para manipular o Buffer

O Buffer possui vários métodos úteis para manipular os dados binários. Alguns exemplos incluem:

  • Buffer.from(string, encoding): cria um novo objeto Buffer a partir de uma string e uma codificação específica.
  • Buffer.concat(list, totalLength): concatena vários buffers em um único buffer.
  • buffer.slice(start, end): retorna uma nova instância de buffer contendo uma fatia dos dados do buffer original.
  • buffer.copy(targetBuffer, targetStart, sourceStart, sourceEnd): copia os dados de um buffer para outro.
  • buffer.toString(encoding, start, end): retorna uma string representando os dados do buffer com uma codificação específica.

Vejamos alguns exemplos de como esses métodos podem ser usados:

// Criando um novo buffer a partir de uma string
const buffer1 = Buffer.from("Hello World", "utf8");
console.log(buffer1); // <Buffer 48 65 6c 6c 6f 20 57 6f 72 6c 64>

// Concatenando vários buffers
const buffer2 = Buffer.from("Hello");
const buffer3 = Buffer.from(" World");
const buffer4 = Buffer.concat([buffer2, buffer3]);
console.log(buffer4.toString()); // "Hello World"

// Criando uma fatia de um buffer
const buffer5 = Buffer.from("Hello World");
const buffer6 = buffer5.slice(6, 11);
console.log(buffer6.toString()); // "World"

// Copiando dados de um buffer para outro
const buffer7 = Buffer.from("Hello World");
const buffer8 = Buffer.alloc(11);
buffer7.copy(buffer8, 0, 6, 11);
console.log(buffer8.toString()); // "World"

Agradecimentos

Obrigado por ler até aqui ❤️, acredito que apenas isso já é o suficiente, caso tenha algo a mais, me diga nos comentários para eu adicionar.

fontes

Documentação oficial, nodejs.reativa, freecodecamp, chat GPT para gerar os exemplos, medium para a imagem

1

Cara, muito maneiro o seu post !
Amanhã vou fazer um post de como eu e um colega utilizamos o buffer para manipular (ler e transformar em um json) um arquivo txt gigantesco de toda a contabilidade mensal da Uber Brasil. Foi um desafio, já que não somos os melhores ou mais experientes devs kkkkk.
Os arquivos vem com uma média de 3 milhões de linhas, 4 a 5 Gbs.

1
1

necessariamente você não vai manipular o Buffer diretamente pois isso ia ser trabalhoso demais, e acho que ninguém ensina isso, você tem que usar algum package de manipulação de imagens, por exemplo o canvas

nesse exemplo eu pego uma imagem apartir de um buffer, usando o package canvas eu giro ela, gero um buffer da imagem gerada e salvo em outro arquivo.

const { createCanvas, loadImage } = require("canvas");
const { readFileSync } = require("fs");

const canvas = createCanvas(800, 600);
const ctx = canvas.getContext("2d");

const imagemEmBuffer= fs.readFileSync("bla/bla/image.jpg");

loadImage(imagemEmBuffer).then((image) => {
    ctx.save();
    ctx.translate(400, 300);
    ctx.rotate(Math.PI / 2);
    ctx.drawImage(image, -300, -400, 600, 800);
    ctx.restore();
    
    const newBuffer = canvas.toBuffer();
    fs.writeFileSync("bla/bla/imagem_rodada.jpg", newBuffer);
});
1

Sensacional, estava estudando muito sobre Web Streams, que inclusive surgiu para co-existir com a Streams Nativas do Node.js permitindo trabalhar com streams em cross-plataform. Quando você está trabalhando com streams cada chunk vindo de uma ReadableStream é um conjunto de dados binários denominados Uint8Array, e vi que o Buffer no Node.js é uma subclasse desse tipo.