Un buffer es una porción de memoria que contiene datos binarios, para nosotros es algo muy similar a tener un array de enteros o hexadecimales.

Buffer

Repositorio

Un buffer es una porción de memoria que contiene datos binarios, para nosotros es algo muy similar a tener un array de enteros o hexadecimales, ya que según la codificación que utilicemos un carácter como por ejemplo la e tiene una representación en la maquina, en este caso si es utf-8 su representación hexadecimal es 65. Trabajar con buffer nos permite que nuestra maquina maneje más eficientemente la memoria y sea todo un poco más rápido.

Para crear un buffer node nos provee el modulo global Buffer, el cual tiene varios métodos para crear, recorrer, escribir, codificar, decodicar entre otros más. En el siguiente código se crean dos ejemplos de buffer, el primero se codifica por defecto con utf-8 y el segundo con utf-16.

// https://ascii.cl/
//utf-8: dos posiciones cada carácter
//utf8/hex: h=68 e=65 l=6c o=6f 
console.log(Buffer.from("hello"));

// https://upload.wikimedia.org/wikipedia/commons/0/01/Unifont_Full_Map.png
//utf16le: cuatro posiciones cada carácter
//utf16le/hex: h=68 00 e=65 00 l=6c 00 o=6f 00 
console.log(Buffer.from("hello", 'utf16le'));

Donde se usa

Nodejs usa buffer en la mayoría de sus módulos a través de los stream y eventos, esto quiere decir que cuando creamos por ejemplo un servidor http y se nos envía un POST con data, esta información va llegar por medio de un stream que contiene un buffer, al igual que cuando leemos un archivo, ya sea un PDF o una imagen toda esta información se convierte a un buffer, el cual es más fácil de manipular para ser enviado por partes si tal vez es muy pesado como puede ser un archivo o un videos de 1GB.

Buffer —> 68 65 6c 6f —> chuck —> out
const buf = Buffer.from("hello")
// <Buffer 68 65 6c 6c 6f>

console.log(buf.toString());
// hello
console.log(buf.toString('hex'));
// 68656c6c6f
console.log(buf.toString('base64'));
// aGVsbG8=
console.log(buf.toString('utf16le'));
// 敨汬

Un ejemplo de buffer es cuando tratamos de leer un archivo, la información que obtenemos es una instacia de buffer, por lo tanto podemos ver nuestra imagen como una serie de caracteres

var fs = require('fs');

fs.readFile('./dino.jpg', function (err, data ) {
    // data is instance of buffer
  console.log(data.toString('base64'));
});
const fs = require("fs");
// se copia una imagen de forma asincrona.
fs.createReadStream('./dino.jpg', {encoding: 'base64'})
.pipe(fs.createWriteStream('./dino-copy.jpg', {encoding: 'base64'}));