Maison  >  Article  >  interface Web  >  Créez facilement un serveur nodejs (8) : Comment le non-blocage est-il obtenu_node.js

Créez facilement un serveur nodejs (8) : Comment le non-blocage est-il obtenu_node.js

WBOY
WBOYoriginal
2016-05-16 16:25:511088parcourir

Dans cette section, nous verrons comment nodejs implémente les opérations non bloquantes.

Modifions d'abord le gestionnaire de démarrage :

Copier le code Le code est le suivant :

var exec = require("child_process").exec;
fonction start() {
console.log("Le gestionnaire de requêtes 'start' a été appelé.");
var content = "vide";
exec("ls -lah", fonction (erreur, stdout, stderr) {
contenu = sortie standard ;
});
Retourner le contenu ;
>

fonction upload() {
console.log("Le gestionnaire de requêtes 'upload' a été appelé.");
Renvoyez « Bonjour le téléchargement » ;
>

exports.start = start;
exports.upload = télécharger;

Ce code crée une nouvelle variable content (la valeur initiale est "vide"), exécute la commande "ls -lah", attribue le résultat au contenu et renvoie enfin le contenu.

Nous avons introduit un nouveau module Node.js, child_process, qui permet d'implémenter une opération non bloquante simple et pratique : exec().

Alors, que fait exec() ?

Il exécute une commande shell depuis Node.js. Dans l'exemple ci-dessus, nous l'utilisons pour obtenir tous les fichiers du répertoire actuel ("ls -lah"), puis nous envoyons les informations sur le fichier au navigateur lorsque /startURL est demandé.

Nous démarrons le serveur et visitons "http://localhost:8888/start" et nous constaterons que le contenu de sortie de la page est vide.

exec() entre en jeu. Avec lui, nous pouvons effectuer des opérations shell très chronophages sans forcer notre application à s'arrêter et à attendre l'opération.

Même ainsi, le contenu produit par la page ne semble pas être le résultat que nous souhaitons.

Analysons les raisons :

Notre code est exécuté de manière synchrone, ce qui signifie qu'après avoir appelé exec(), Node.js exécutera immédiatement le contenu de retour

;

À l'heure actuelle, le contenu est toujours "vide" car la fonction de rappel passée à exec() n'a pas encore été exécutée - car le fonctionnement de exec() est asynchrone.

Nous présenterons comment résoudre ce problème dans la section suivante.

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn