330 votes

Récupérer les données de fs.readFile

    var content;
    fs.readFile('./Index.html', function read(err, data) {
        if (err) {
            throw err;
        }
        content = data;
    });
    console.log(content);

Erreur : le contenu est indéfini. Pouvez-vous m'aider ?

2 votes

Fs.readFileSync possède également des fonctionnalités intéressantes pour lire un fichier même s'il est au format unicode utf8.

0 votes

N.B. fs.readFile peut aussi faire cela ^ voir ma réponse ci-dessous

20voto

Aravin Points 2180

Cette ligne va fonctionner,

const content = fs.readFileSync('./Index.html', 'utf8');
console.log(content);

1 votes

7 ans ont passé :) fs.readFileSync est une méthode de synchronisation, donc pas besoin de await là. Await est utile avec les promesses ( nodejs.org/api/fs.html#fs_fs_promesses_api ), lorsque vous souhaitez écrire du code asynchrone avec une syntaxe similaire au code synchrone.

0 votes

@karaxuna, oui, retiré. Je viens de rencontrer ce cas aujourd'hui et je l'ai résolu en utilisant le code ci-dessus.

1 votes

C'est la réponse la plus simple. Si vous n'avez pas besoin de l'asynchronisme, pourquoi diable vous mélanger avec la version asynchrone du tout, avec des callbacks, async/await, etc ? C'est la voie à suivre.

10voto

doctorlee Points 79
const fs = require('fs')
function readDemo1(file1) {
    return new Promise(function (resolve, reject) {
        fs.readFile(file1, 'utf8', function (err, dataDemo1) {
            if (err)
                reject(err);
            else
                resolve(dataDemo1);
        });
    });
}
async function copyFile() {

    try {
        let dataDemo1 = await readDemo1('url')
        dataDemo1 += '\n' +  await readDemo1('url')

        await writeDemo2(dataDemo1)
        console.log(dataDemo1)
    } catch (error) {
        console.error(error);
    }
}
copyFile();

function writeDemo2(dataDemo1) {
    return new Promise(function(resolve, reject) {
      fs.writeFile('text.txt', dataDemo1, 'utf8', function(err) {
        if (err)
          reject(err);
        else
          resolve("Promise Success!");
      });
    });
  }

6 votes

Ne vous contentez pas de mettre du code dans votre réponse... expliquez pourquoi il est différent et comment il résout le problème.

0 votes

@doctorlee Cela fonctionne effectivement pour moi, sans aucune bibliothèque externe. L'explication est nécessaire pour sûr.

9voto

Dominic Tobias Points 3215

Utilisez la bibliothèque promiseify intégrée (Node 8+) pour rendre ces anciennes fonctions de rappel plus élégantes.

const fs = require('fs');
const util = require('util');

const readFile = util.promisify(fs.readFile);

async function doStuff() {
  try {
    const content = await readFile(filePath, 'utf8');
    console.log(content);
  } catch (e) {
    console.error(e);
  }
}

0 votes

Peut être en ligne unique const doStuff = async (filePath) => fs.readFileSync(filePath, 'utf8'); il n'est pas nécessaire d'utiliser util.promisify wrap.

2 votes

Le but est de ne pas utiliser la version de synchronisation, et vous devez gérer les erreurs en l'appelant.

8voto

Taitu-lism Points 23

Comme dit, fs.readFile est une action asynchrone. cela signifie que lorsque vous dites à node de lire un fichier, vous devez considérer que cela prendra un certain temps et que pendant ce temps, node continue à exécuter le code suivant. dans votre cas, c'est : console.log(content); .

C'est comme envoyer une partie du nœud pour un long voyage (comme la lecture d'un gros fichier).

Jetez un coup d'œil à mes commentaires :

var content;

// node, go fetch this file. when you come back, please run this "read" callback function
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    content = data;
});

// in the meantime, please continue and run this console.log
console.log(content);

c'est pourquoi content est toujours vide lorsque vous l'enregistrez. Le nœud n'a pas encore récupéré le contenu du fichier.

Cela pourrait être résolu en déplaçant console.log(content) dans la fonction de rappel, juste après content = data; . de cette façon, vous verrez le journal lorsque le nœud a terminé de lire le fichier et après content obtient une valeur.

8voto

Lecture synchrone et asynchrone de fichiers :

//fs module to read file in sync and async way

var fs = require('fs'),
    filePath = './sample_files/sample_css.css';

// this for async way
/*fs.readFile(filePath, 'utf8', function (err, data) {
    if (err) throw err;
    console.log(data);
});*/

//this is sync way
var css = fs.readFileSync(filePath, 'utf8');
console.log(css);

Node Cheat Disponible sur lire_fichier .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X