Node.js de fs.readFileSync() pour fs.readFile()
Je suis en train d'essayer d'obtenir ma tête autour synchrone vs asynchrone dans Node.js en particulier pour la lecture d'un fichier html.
Dans un gestionnaire de requêtes, 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;
- Ce serait la version à l'aide readFile() ??
- Je comprends que readFile est asynchrone, donc, théoriquement, je devrais attendre que
le fichier est lu avant de le rendre, de sorte que dois-je introduire
un addListener? J'ai peut être source de confusion choses différentes.
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();
}
J'obtiens une page blanche, je suppose que c'est parce qu'il doit attendre que toutes les données ont été lues, avant resp.write(data), comment dois-je le signaler?
- Demandez-vous, quel serait l'équivalent de code si vous étiez à utiliser,
readFile()
et comment géreriez-vous d'envoyer le contenu de manière asynchrone? - Oui, c'est ce que je me demande, quel est l'équivalent du code à l'aide de fs.readFile() ?
- déplacer le
resp.end()
au sein de votre rappel. C'est pourquoi vous obtenez une page blanche. - Oui, j'ai vu qu'avec lombausch réponse, savez-vous pourquoi j'ai besoin de mettre resp.fin() à l'intérieur de la fonction de rappel? Thx
- Lors de l'utilisation de méthodes asynchrones, comme
readFile
dans votre code ci-dessus en vous disant que le programme pour, "lire le contenu d'un fichier, et lorsque vous avez terminé (mot-clé, "quand") lire le contenu, les utiliser comme le corps de la réponse". Sans fournir laresp.end()
appeler à l'intérieur de votre rappel (comme vu ci-dessus), le programme appellereadFile
et puis tout de suite à des appelsresp.end()
avant votre rappel a l'heure pour effectuer leresp.write
. Cela fait-il sens? - Voici une description de ce qui est la logique est à l'œuvre derrière les scènes de
readFileSync()
stackoverflow.com/a/56110224/4701635
Vous devez vous connecter pour publier un commentaire.
resp.end()
sera immédiatement invoqué comme il n'est pas en attente de la réponse de la fonction de rappel.Cette variante est mieux parce que vous ne pouvait pas savoir si un fichier existe ou pas. Vous devez envoyer l'en-tête correcte quand vous savez pour certain que vous pouvez lire le contenu de votre fichier. Aussi, si vous avez des branches de code qui ne se termine pas avec".fin()', le navigateur va attendre jusqu'à ce qu'il les obtenir. En d'autres termes, votre navigateur va attendre un long moment.