La lecture et le renvoi de plusieurs fichiers en Node.js à l'aide de fs.readFile
Je suis en train d'écrire un simple gestionnaire des demandes de retour d'une paire de fichiers css. À l'aide de fs.readFileSync c'était facile. Cependant, je vais avoir des difficultés à accomplir la même tâche à l'aide de la version asynchrone de readFile. Ci-dessous mon code. Avoir ma réponse.méthode write() appels répartis entre deux différents rappels semble être problématique. Quelqu'un peut-il point de ce que j'ai fait de mal? Il est intéressant de noter que ce code fonctionne si je mets la réponse.fin() à l'intérieur de la première instruction else. Cependant, cela crée un problème en ce que le deuxième fichier css ne obtenez pas de retour (car la réponse.fin() a déjà été tiré).
function css(response) {
response.writeHead(200, {"Content-Type": "text/css"});
fs.readFile('css/bootstrap.css', function(error, content){
if(error){
console.log(error);
}
else{
response.write(content);
}
});
fs.readFile('css/bootstrap-responsive.css', function(error, content){
if(error){
console.log(error);
}
else{
response.write(content)
}
});
response.end();
}
Oui, c'est vrai.
Est-il une raison pour laquelle vous devez lire les fichiers chaque fois que quelqu'un fait une demande? Attendez-vous à changer souvent? Si non, il suffit de lire dans la mémoire lorsque le serveur est démarré et retour en cas de besoin. Fonctionne plus rapidement.
Ou, prendre un coup d'oeil à fs.montre nodejs.org/docs/latest/api/...
OriginalL'auteur hughesdan | 2012-02-25
Vous devez vous connecter pour publier un commentaire.
Le principal problème avec ce que vous avez est que
response.end()
est appelé tout de suite. Vous devez seulement appeler ça une fois que les fichiers ont fait leurresponse.write
appels.La façon la plus simple serait d'utiliser un flux de contrôle de la bibliothèque. La gestion de plusieurs rappels asynchrones est généralement compliqué.
https://github.com/joyent/node/wiki/modules#wiki-async-flow
Je vais utiliser le asynchrone bibliothèque parce que c'est celui que je connais le mieux.
Si vous voulez atteindre cet objectif sans une bibliothèque, ou voulez juste une autre façon, c'est comment je pourrais le faire plus directement. Fondamentalement, vous gardez un
count
et appelend
une fois que les deux lectures de fichier avez terminé.un endroit que vous appelez la fonction css?
De l'intérieur de la fonction de rappel pour nodejs.org/api/http.html#http_http_createserver_requestlistener ou tout Nœud de l'API serveur de packages.
OriginalL'auteur loganfsmyth
Vous pouvez simplement compter sur html5 Promesse. Le code peut être aussi simple, comme suit:
OriginalL'auteur orabis
Il y a une simple solution commune pour tous avec une fonction de rappel.
Vous pouvez le placer n'importe où dans votre projet de réutilisation dans de nombreux cas différents.
Vient de mettre à l'intérieur une masse de fichiers et il revient à chacun d'entre vous d'eux comme un tampon.
Exemple Simple:
Offtopic: Btw, les demandes de ce genre vous feriez mieux de cache sur le serveur proxy frontal comme nginx ou de vernis. Il n'est jamais changer.
OriginalL'auteur
Asynchrone est un jeu génial de lib. Toutefois, la norme pour ces choses est en mouvement dans la direction de promesses pour la manipulation de plusieurs opérations asynchrones. En fait, dans ECMAScript6 ce sera une partie standard de la bibliothèque. Il existe plusieurs bibliothèques qui mettent en œuvre des promesses dont JQuery. Cependant, pour le nœud, j'aime utiliser 'q'
Voici le même code à l'aide de promesses: Une note.. vous pouvez déplacer la première writeHead appel à coïncider avec le succès de la première lecture.
OriginalL'auteur Cheruvim