Cela revient haut sur Google, donc je voudrais ajouter quelques informations contextuelles sur la question d'origine (c'est moi qui souligne):
Pourquoi fs.readFile () de Node.js renvoie-t-il un tampon au lieu d'une chaîne?
Parce que les fichiers ne sont pas toujours du texte
Même si vous en tant que programmeur le savez: Node n'a aucune idée du contenu du fichier que vous essayez de lire. Il peut s'agir d'un fichier texte, mais il peut tout aussi bien s'agir d'une archive ZIP ou d'une image JPG - Node ne sait pas.
Parce que la lecture des fichiers texte est délicate
Même si Node savait qu'il devait lire un fichier texte, il n'aurait toujours aucune idée du codage des caractères utilisé (c'est-à-dire comment les octets dans le fichier sont mappés en caractères lisibles par l'homme), car le codage de caractères lui-même n'est pas stocké dans le fichier .
Il y a moyen 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, parce qu'il ne connaît pas et ne peut pas connaître tous ces détails, Node lit simplement le fichier octet par octet, sans rien supposer de son contenu.
Et c'est ce que le tampon retourné est: un conteneur sans opinion pour le contenu binaire brut. La façon dont ce contenu doit être interprété dépend de vous en tant que développeur.
C'est la seule réponse qui répond réellement à la question dans le titre.
frzsombor
4
@frzsombor Étant donné qu'il existe une réponse acceptée, je suppose que l'OP était vraiment intéressé à obtenir des chaînes au lieu de tampons et ne pouvait tout simplement pas formuler la question correctement. Néanmoins, d'autres personnes pourraient venir de Google avec le «pourquoi» en tête, d'où ma réponse. :)
Un peu vieux, mais il faut savoir que cette solution introduit une surcharge supplémentaire puisqu'elle buffer.toString()suppose de toute façon le codage utf-8. Ainsi, cela équivaudrait à (bien que plus lentement que) la réponse de @hvgotcodes.
Brandon
14
La datavariable contient un Bufferobjet. Convertissez-le en encodage ASCII en utilisant la syntaxe suivante:
Async:
Sync:
la source
Il renvoie un objet Buffer.
Si vous le voulez dans une chaîne, vous pouvez le convertir avec
data.toString()
:la source
buffer.toString()
suppose de toute façon le codage utf-8. Ainsi, cela équivaudrait à (bien que plus lentement que) la réponse de @hvgotcodes.La
data
variable contient unBuffer
objet. Convertissez-le en encodage ASCII en utilisant la syntaxe suivante:De manière asynchrone:
la source