web-dev-qa-db-fra.com

Différence entre readFile et readFileSync

Le code suivant renvoie le contenu du fichier index.html (il ne contient que le texte hello world) au navigateur. Cependant, lorsque je remplace readFile par readFileSync, la requête expire. Qu'est-ce que je rate? Un autre type de tampon est-il requis? J'utilise le noeud 0.61 et Express 2.4

var express = require('express');
var fs = require('fs');

var app = express.createServer(express.logger());

app.get('/', function(request, response) {
    fs.readFile('index.html', function(err, data){
        response.send(data.toString());
    });
});

var port = process.env.PORT || 5000;
app.listen(port, function() {
  console.log("Listening on " + port);
});
39
Ali

fs.readFile reprend un appel qui appelle response.send comme vous l'avez montré - bon. Si vous remplacez simplement cela par fs.readFileSync , vous devez être conscient du fait qu'il ne prend pas de rappel afin que votre rappel qui appelle response.send ne soit jamais appelé et que, par conséquent, la réponse ne se termine jamais. temps libre.

Vous devez afficher votre code readFileSync si vous ne remplacez pas simplement readFile par readFileSync.

Aussi, juste pour votre information, vous devriez ne jamais appeler readFileSync dans un nœud express/webserver car il y aura une boucle de thread unique pendant que je/O est effectuée. Vous souhaitez que la boucle de noeud traite d'autres demandes jusqu'à la fin de l'opération d'E/S et jusqu'à ce que votre code de gestion des rappels puisse être exécuté.

50
bryanmac
'use strict'
var fs = require("fs");

/***
 * implementation of readFileSync
 */
var data = fs.readFileSync('input.txt');
console.log(data.toString());
console.log("Program Ended");

/***
 * implementation of readFile 
 */
fs.readFile('input.txt', function (err, data) {
    if (err) return console.error(err);
   console.log(data.toString());
});

console.log("Program Ended");

Pour une meilleure compréhension, exécutez le code ci-dessus et comparez les résultats.

17
Saurabh Chauhan

readFileSync() est synchrone et bloque l'exécution jusqu'à la fin. Ceux-ci renvoient leurs résultats sous forme de valeurs de retour. readFile() sont asynchrones et reviennent immédiatement tant qu'ils fonctionnent en arrière-plan. Vous passez une fonction de rappel qui est appelée quand ils ont fini. Prenons un exemple pour non-blocage.

la méthode suivante lit un fichier de manière non bloquante

var fs = require('fs');
fs.readFile(filename, "utf8", function(err, data) {
        if (err) throw err;
        console.log(data);
});

ce qui suit est lu un fichier de manière bloquante ou synchrone.

var data = fs.readFileSync(filename);

LOL ... Si vous ne voulez pas que readFileSync() soit bloquant, prenez référence au code suivant. (Originaire de)

var fs = require('fs');
function readFileAsSync(){
    new Promise((resolve, reject)=>{
        fs.readFile(filename, "utf8", function(err, data) {
                if (err) throw err;
                resolve(data);
        });
    });
}

async function callRead(){
    let data = await readFileAsSync();
    console.log(data);
}

callRead();

c'est moyen derrière les scènes readFileSync() fonctionne comme ci-dessus (promesse) base.

3
Paresh Barad