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

378voto

Matt Esch Points 7513

Pour développer ce que @Raynos a dit, la fonction que vous avez définie est un callback asynchrone. Elle ne s'exécute pas immédiatement, mais plutôt lorsque le chargement du fichier est terminé. Lorsque vous appelez readFile, le contrôle est retourné immédiatement et la ligne de code suivante est exécutée. Ainsi, lorsque vous appelez console.log, votre callback n'a pas encore été invoqué, et ce contenu n'a pas encore été défini. Bienvenue dans la programmation asynchrone.

Exemples d'approches

var content;
// First I want to read the file
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    content = data;

    // Invoke the next step here however you like
    console.log(content);   // Put all of the code here (not the best solution)
    processFile();          // Or put the next step in a function and invoke it
});

function processFile() {
    console.log(content);
}

Ou mieux encore, comme le montre l'exemple de Raynos, intégrez votre appel dans une fonction et passez vos propres callbacks. (Apparemment, c'est une meilleure pratique) Je pense que prendre l'habitude d'envelopper vos appels asynchrones dans une fonction qui prend un callback vous épargnera beaucoup de problèmes et de code désordonné.

function doSomething (callback) {
    // any async callback invokes callback with response
}

doSomething (function doSomethingAfter(err, result) {
    // process the async result
});

2 votes

Sync I/O a sa place - c'est bien si vous faites un petit système ou outil de construction. Sur des systèmes plus importants ou des applications serveur, la meilleure pratique est de l'éviter.

34 votes

Tout n'est pas un serveur web. Et il n'y a rien d'horrible à utiliser des versions synchronisées de méthodes pour des appels ponctuels avant que le serveur ne commence à prendre des requêtes. Toute personne utilisant Node devrait vraiment comprendre pourquoi avant de l'utiliser. Et surtout avant d'en parler sur son blog.

287voto

Logan Points 2012

Il existe en fait une fonction synchrone pour cela :

http://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_encoding

Asynchrone

fs.readFile(filename, [encoding], [callback])

Lit de manière asynchrone l'intégralité du contenu d'un fichier. Exemple :

fs.readFile('/etc/passwd', function (err, data) {
  if (err) throw err;
  console.log(data);
});

La fonction de rappel reçoit deux arguments (err, data), où data est le contenu du fichier.

Si aucun encodage n'est spécifié, alors le tampon brut est retourné.


SYNCHRONOUS

fs.readFileSync(filename, [encoding])

Version synchrone de fs.readFile. Renvoie le contenu du nom de fichier.

Si l'encodage est spécifié, cette fonction renvoie une chaîne de caractères. Sinon, elle renvoie un tampon.

var text = fs.readFileSync('test.md','utf8')
console.log (text)

0 votes

Question rapide, quelle est l'utilisation du tampon qui est retourné dans la version synchrone de readFile ? Si je lis un fichier de manière synchrone et que je ne passe pas d'encodage, le tampon est imprimé, comment puis-je l'utiliser ? Merci.

12 votes

J'en ai fait l'expérience récemment. Disons que notre tampon est data . if (Buffer.isBuffer( data){ result = data.toString('utf8'); } Maintenant, nous avons converti le tampon en texte lisible. C'est une bonne chose pour lire un fichier en texte clair ou pour tester le fichier par rapport à des types de format. Je pourrais faire un try/catch pour voir s'il s'agit d'un fichier JSON par exemple, mais seulement après que le tampon ait été converti en texte. Regardez ici pour plus d'informations : nodejs.org/api/buffer.html

0 votes

De plus, pour autant que je sache, les tampons sont des flux d'octets, et sont bons pour envoyer des données "morceau par morceau". Vous avez dû voir que le tampon est quelque chose comme AF 42 F1 . Très pratique pour la communication client-serveur-client.

123voto

Raynos Points 82706
function readContent(callback) {
    fs.readFile("./Index.html", function (err, content) {
        if (err) return callback(err)
        callback(null, content)
    })
}

readContent(function (err, content) {
    console.log(content)
})

7 votes

Merci beaucoup, si j'avais 15 points, je voterais pour votre réponse :)

0 votes

Bonjour, dans la première ligne de votre code, function readContent(callback) c'est callback un mot réservé ? Je veux dire, est-ce la façon standard d'implémenter des callbacks pour vos fonctions personnalisées ? Je viens de commencer à apprendre Node.

3 votes

Salut Amal. Le callback est simplement l'argument passé à sa fonction, il peut être event ou c ou le nom que vous voulez - ce n'est pas un mot réservé en Javascript, et je suppose que la même chose s'applique à Node.js.

71voto

Evan Carroll Points 13420

Utilisation des promesses avec ES7

Utilisation asynchrone avec mz/fs

Le site mz fournit des versions promises de la bibliothèque centrale des nœuds. Leur utilisation est simple. Installez d'abord la bibliothèque...

npm install mz

Alors...

const fs = require('mz/fs');
fs.readFile('./Index.html').then(contents => console.log(contents))
  .catch(err => console.error(err));

Vous pouvez également les écrire dans des fonctions asynchrones :

async function myReadfile () {
  try {
    const file = await fs.readFile('./Index.html');
  }
  catch (err) { console.error( err ) }
};

6 votes

C'est l'avenir et devrait être fortement upvoted par tout le monde :) merci

2 votes

Semble intéressant. Une coquille : "console.error(catch)" devrait être "console.error(err)", je suppose.)

2 votes

Si vous ne voulez pas ajouter un paquet supplémentaire, essayez la solution de @doctorlee ci-dessous

21voto

user2266928 Points 425
var data = fs.readFileSync('tmp/reltioconfig.json','utf8');

utilisez ceci pour appeler un fichier de manière synchrone, sans coder sa sortie d'affichage comme un tampon.

2 votes

Il faut une ligne vierge avant les blocs de code pour que la belle impression se mette en place.

0 votes

Briefé & le meilleur !

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