¿Por qué fs.readFile() de Node.js devuelve un búfer en lugar de una cadena?
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.txt
fue 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$
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) {...});
Intentar:
fs.readFile("test.txt", "utf8", function(err, data) {...});
Básicamente, necesitas especificar la codificación.
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.
Asíncrono:
fs.readFile('test.txt', 'utf8', callback);
Sincronización:
var content = fs.readFileSync('test.txt', 'utf8');