¿Por qué fs.readFile() de Node.js devuelve un búfer en lugar de una cadena?

Resuelto Nathan Campos asked hace 13 años • 8 respuestas

Estoy intentando leer el contenido de test.txt(que se encuentra en la misma carpeta de la fuente de Javascript) y mostrarlo usando este código:

var fs = require("fs");

fs.readFile("test.txt", function (err, data) {
    if (err) throw err;
    console.log(data);
});

El contenido del test.txtfue creado en nano:

Probando Node.js readFile()

Y me sale esto:

Nathan-Camposs-MacBook-Pro:node_test Nathan$ node main.js
<Buffer 54 65 73 74 69 6e 67 20 4e 6f 64 65 2e 6a 73 20 72 65 61 64 46 69 6c 65 28 29>
Nathan-Camposs-MacBook-Pro:node_test Nathan$ 
Nathan Campos avatar Jun 23 '11 22:06 Nathan Campos
Aceptado

De los documentos:

Si no se especifica ninguna codificación, se devuelve el búfer sin formato.

Lo que podría explicar el <Buffer ...>. Especifique una codificación válida, por ejemplo utf-8, como segundo parámetro después del nombre del archivo. Como,

fs.readFile("test.txt", "utf8", function(err, data) {...});
davin avatar Jun 23 '2011 15:06 davin

Intentar:

    fs.readFile("test.txt", "utf8", function(err, data) {...});

Básicamente, necesitas especificar la codificación.

hvgotcodes avatar Jun 23 '2011 15:06 hvgotcodes

Esto ocupa un lugar destacado en Google, por lo que me gustaría agregar información contextual sobre la pregunta original (el énfasis es mío):

¿Por qué fs.readFile() de Node.js devuelve un búfer en lugar de una cadena?

Porque los archivos no siempre son de texto

Incluso si usted, como programador, lo sabe: Node no tiene idea de lo que hay en el archivo que está intentando leer. Podría ser un archivo de texto, pero también podría ser un archivo ZIP o una imagen JPG; Node no lo sabe.

Porque leer archivos de texto es complicado

Incluso si Node supiera que va a leer un archivo de texto, todavía no tendría idea de qué codificación de caracteres se utiliza (es decir, cómo los bytes en el archivo se asignan a caracteres legibles por humanos), porque la codificación de caracteres en sí no está almacenada en el archivo. .

Hay formas de adivinar la codificación de caracteres de archivos de texto con mayor o menor confianza (eso es lo que hacen los editores de texto al abrir un archivo), pero normalmente no querrás que tu código dependa de conjeturas sin tus instrucciones explícitas.

¡Buffers al rescate!

Entonces, debido a que no conoce ni puede conocer todos estos detalles, Node simplemente lee el archivo byte por byte, sin asumir nada sobre su contenido.

Y eso es lo que es el búfer devuelto: un contenedor sin opinión para los bytes sin formato del archivo. La forma en que se deben interpretar estos bytes depende de usted como desarrollador.

Loilo avatar Apr 11 '2018 08:04 Loilo

Asíncrono:

fs.readFile('test.txt', 'utf8', callback);

Sincronización:

var content = fs.readFileSync('test.txt', 'utf8');
wangchi avatar Jul 18 '2016 07:07 wangchi