web-dev-qa-db-fra.com

Pourquoi fs.readFile () de Node.js renvoie-t-il un tampon au lieu d'une chaîne?

J'essaie de lire le contenu de test.txt (qui se trouve dans le même dossier que la source Javascript) et de l'afficher à l'aide du code suivant:

var fs = require("fs");

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

Le contenu de test.txt a été créé sur nano:

Test de Node.js readFile ()

Et j'obtiens ceci:

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$ 
300
Nathan Campos

De les docs:

Si aucun codage n'est spécifié, le tampon brut est renvoyé.

Ce qui pourrait expliquer le <Buffer ...>. Spécifiez un codage valide, par exemple utf-8, en tant que deuxième paramètre après le nom de fichier. Tel que,

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

essayer

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

fondamentalement, vous devez spécifier le codage.

154
hvgotcodes

Il renvoie un objet Buffer.

Si vous le voulez dans une chaîne, vous pouvez le convertir avec data.toString():

var fs = require("fs");

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

Async:

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

Sync:

var content = fs.readFileSync('test.txt', 'utf8');
32
wangchi

Cela vient en haut de Google, donc je voudrais ajouter quelques informations contextuelles sur la question initiale (l'emphase mienne):

Pourquoi Est-ce que fs.readFile () de Node.js renvoie un tampon au lieu d'une chaîne?

Parce que les fichiers ne sont pas toujours du texte

Même si vous le programmeur le sait: Node n'a aucune idée du contenu du fichier que vous essayez de lire. Ce pourrait être un fichier texte, mais il pourrait tout aussi bien s'agir d'une archive Zip ou d'une image JPG - Node ne sait pas.

Parce que lire des fichiers texte est délicat

Même si Node savait qu'il lisait un fichier texte, il n'aurait toujours aucune idée de ce qui codage de caractères est utilisé (c'est-à-dire mappage des octets du fichier avec des caractères lisibles par l’homme), car le codage de caractères lui-même n’est pas stocké dans le fichier.

Il existe des moyens de deviner l'encodage des caractères des fichiers texte avec plus ou moins de confiance (c'est ce que font les éditeurs de texte lors de l'ouverture d'un fichier), mais vous ne voulez généralement pas que votre code repose sur des suppositions sans votre instruction explicite.

Des tampons à la rescousse!

Donc, comme il ne sait pas et ne peut pas connaître tous ces détails, Node ne fait que lire l'octet du fichier pour l'octet, sans rien supposer de son contenu.

Et c'est ce que le tampon renvoyé est: un conteneur non prévu pour le contenu binaire brut. Comment ce contenu doit être interprété est à vous en tant que développeur.

31
Loilo

La variable data contient un objet Buffer. Convertissez-le en ASCII encodage en utilisant la syntaxe suivante:

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

Asynchrone:

fs.readFile('test.txt', 'utf8', function (error, data) {
    if (error) throw error;
    console.log(data.toString());
});
14
ayusha