web-dev-qa-db-fra.com

Node.js de fs.readFileSync () à fs.readFile ()

J'essaie de comprendre ce qui se passe de manière synchrone ou asynchrone dans Node.js, en particulier pour lire un fichier html.

Dans un gestionnaire de demandes, la version synchrone que j'utilise, qui fonctionne est la suivante:

var fs = require("fs");
var filename = "./index.html";
var buf = fs.readFileSync(filename, "utf8");

function start(resp) {
    resp.writeHead(200, {"Content-type":"text/html"});
    resp.write(buf);
    resp.end();
    }

exports.start=start; 
  1. Quelle serait la version utilisant readFile () ??
  2. Je comprends que readFile est asynchrone, donc théoriquement, je devrais attendre que tout le fichier soit lu avant de le rendre. Devrais-je donc introduire un addListener? Je pourrais confondre différentes choses.

Edit: j'ai essayé de refactoriser le code comme ceci:

var fs = require("fs");
var filename = "./index.html";
function start (resp) {
    resp.writeHead(200, {"Content-Type":"text/html"});
    fs.readFile(filename, "utf8", function (err, data) {
        if (err) throw err;
        resp.write(data);
        });
    resp.end();
    }

Je reçois une page blanche, je suppose que c’est parce qu’il faut attendre que toutes les données aient été lues, avant d’écrire (données), comment puis-je le signaler?

42
Bondifrench
var fs = require("fs");
var filename = "./index.html";

function start(resp) {
    resp.writeHead(200, {
        "Content-Type": "text/html"
    });
    fs.readFile(filename, "utf8", function(err, data) {
        if (err) throw err;
        resp.write(data);
        resp.end();
    });
}
42
webduvet

Cette variante est préférable car vous ne pouvez pas savoir si le fichier existe ou non. Vous devez envoyer un en-tête correct lorsque vous êtes certain de pouvoir lire le contenu de votre fichier. De plus, si vous avez des branches de code qui ne finissent pas par '.end ()', le navigateur attendra de les avoir. En d'autres termes, votre navigateur attendra longtemps.

var fs = require("fs");
var filename = "./index.html";

function start(resp) {

    fs.readFile(filename, "utf8", function(err, data) {
        if (err) {
            // may be filename does not exists?
            resp.writeHead(404, {
                'Content-Type' : 'text/html'
            });
            // log this error into browser
            resp.write(err.toString());
            resp.end();
        } else {

            resp.writeHead(200, {
                "Content-Type": "text/html"
            });      
            resp.write(data.toString());
            resp.end();
        }
    });
}
8