Estoy tratando de leer el contenido de test.txt (que está en la misma carpeta de la fuente 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 de test.txt se creó en nano:

Prueba de Node.js readFile ()

Y estoy obteniendo 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$ 
421
Nathan Campos 23 jun. 2011 a las 19:44

6 respuestas

La mejor respuesta

De los documentos:

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

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

fs.readFile("test.txt", "utf8", function(err, data) {...});
528
Tomáš Zato - Reinstate Monica 10 feb. 2018 a las 11:32

La variable data contiene un objeto Buffer. Conviértalo en codificación ASCII utilizando la siguiente sintaxis:

data.toString('ascii', 0, data.length)

Asincrónicamente:

fs.readFile('test.txt', 'utf8', function (error, data) {
    if (error) throw error;
    console.log(data.toString());
});
14
ayusha 23 mar. 2018 a las 15:30

Está devolviendo un objeto Buffer.

Si lo quieres en una cadena, puedes convertirlo con data.toString():

var fs = require("fs");

fs.readFile("test.txt", function (err, data) {
    if (err) throw err;
    console.log(data.toString());
});
36
Andz 23 jun. 2011 a las 16:30

Esto aparece en Google, por lo que me gustaría agregar información contextual sobre la pregunta original (énfasis mío):

¿Por qué devuelve el fs.readFile () de Node.js un buffer en lugar de una cadena?

Porque los archivos no siempre son texto

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

Porque leer archivos de texto es complicado

Incluso si el Nodo sabía que fuera para leer un archivo de texto, aún no tendría idea de qué se utiliza la codificación de caracteres (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 se almacena en el archivo.

Hay formas de adivinar la codificación de caracteres de los archivos de texto con más o menos confianza ( eso es lo que hacen los editores de texto al abrir un archivo), pero generalmente no desea que su código se base en conjeturas sin su instrucción explícita.

¡Amortiguadores al rescate!

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

Y eso es lo que es el búfer devuelto: un contenedor no opinado para contenido binario sin procesar. Cómo debe interpretarse este contenido depende de usted como desarrollador.

53
Loilo 25 oct. 2018 a las 08:30

Asíncrono:

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

Sincronización:

var content = fs.readFileSync('test.txt', 'utf8');
43
Blues Dari 18 jul. 2016 a las 07:30

Tratar

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

Básicamente necesitas especificar la codificación.

162
Nick 10 may. 2017 a las 12:45