Isso aparece no Google, então eu gostaria de adicionar algumas informações contextuais sobre a pergunta original (grifo meu):
Por que o fs.readFile () do Node.js retorna um buffer em vez de uma string?
Como os arquivos nem sempre são textos
Mesmo que você como programador o conheça: o Node não tem idéia do que está no arquivo que você está tentando ler. Pode ser um arquivo de texto, mas também pode ser um arquivo ZIP ou uma imagem JPG - o Node não sabe.
Porque ler arquivos de texto é complicado
Mesmo que o Node soubesse que deveria ler um arquivo de texto, ainda não teria idéia de qual codificação de caracteres é usada (ou seja, como os bytes no arquivo são mapeados para caracteres legíveis por humanos), porque a codificação de caracteres em si não é armazenada no arquivo .
Existem maneiras de adivinhar a codificação de caracteres de arquivos de texto com mais ou menos confiança (é o que os editores de texto fazem ao abrir um arquivo), mas geralmente você não deseja que seu código se baseie em suposições sem instruções explícitas.
Buffers para o resgate!
Portanto, como não conhece e não pode conhecer todos esses detalhes, o Node apenas lê o arquivo byte por byte, sem assumir nada sobre seu conteúdo.
E é isso que o buffer retornado é: um contêiner não-mencionado para conteúdo binário bruto. A decisão de como esse conteúdo deve ser interpretado depende de você, como desenvolvedor.