Maison  >  Article  >  interface Web  >  Créez facilement un serveur nodejs (9) : Implémentez des opérations_node.js non bloquantes

Créez facilement un serveur nodejs (9) : Implémentez des opérations_node.js non bloquantes

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

Nous souhaitons transmettre l'objet de réponse (obtenu à partir de la fonction de rappel du serveur onRequest()) au gestionnaire de requêtes via la route des requêtes. Le gestionnaire peut ensuite répondre à la demande en utilisant des fonctions sur cet objet.

Modifions d'abord server.js :

Copier le code Le code est le suivant :

var http = require("http");
var url = require("url");
fonction start(route, handle) {
function onRequest (demande, réponse) {
var chemin d'accès = url.parse(request.url).chemin d'accès;
console.log("Demande de " chemin d'accès " reçue."); route(handle, chemin, réponse);
>
http.createServer(onRequest).listen(8888);
console.log("Le serveur a démarré.");
>
exports.start = start;

Nous transmettons l'objet de réponse comme troisième paramètre à la fonction route(), et nous supprimons tous les appels de fonction liés à la réponse dans le gestionnaire onRequest(), car nous voulons que cette partie du travail soit effectuée par la route( ) fonction à compléter.

Modifiez ensuite router.js :

Copier le code Le code est le suivant :
function route (handle, chemin, réponse) {
console.log("Sur le point d'acheminer une requête pour " pathname);
if (typeof handle[pathname] === 'function') {
handle[chemin d'accès](réponse);
} autre {
console.log("Aucun gestionnaire de requêtes trouvé pour " pathname);
réponse.writeHead(404, {"Content-Type": "text/plain"});
réponse.write("404 Non trouvé");
réponse.end();
>
>
exports.route = route;

Même modèle : au lieu d'obtenir la valeur de retour du gestionnaire de requêtes, cette fois l'objet de réponse est transmis directement. S'il n'y a pas de processeur de requête correspondant à traiter, nous renverrons directement une erreur "404".

Modifiez ensuite requestHandler.js :

Copier le code Le code est le suivant :
var exec = require("child_process").exec;
fonction start(réponse) {
console.log("Le gestionnaire de requêtes 'start' a été appelé.");
exec("ls -lah", fonction (erreur, stdout, stderr) {
réponse.writeHead(200, {"Content-Type": "text/plain"});
réponse.write(stdout);
réponse.end();
});
>

fonction télécharger (réponse) {
console.log("Le gestionnaire de requêtes 'upload' a été appelé.");
réponse.writeHead(200, {"Content-Type": "text/plain"});
réponse.write("Bonjour le téléchargement");
réponse.end();
>

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

Notre fonction de gestionnaire doit recevoir le paramètre de réponse afin de répondre directement à la requête. Le gestionnaire de démarrage effectue l'opération de réponse à la demande dans la fonction de rappel anonyme de exec(), tandis que le gestionnaire de téléchargement répond toujours simplement "Hello World", mais cette fois il utilise l'objet de réponse.

Si vous souhaitez prouver que les opérations fastidieuses dans le gestionnaire /start ne bloqueront pas la réponse immédiate à la requête /upload, vous pouvez modifier requestHandlers.js sous la forme suivante :

Copier le code Le code est le suivant :
var exec = require("child_process").exec;
fonction start(réponse) {
console.log("Le gestionnaire de requêtes 'start' a été appelé.");
exec("trouver /",
{ délai d'attente : 10000, maxBuffer : 20000*1024 },
fonction (erreur, stdout, stderr) {
réponse.writeHead(200, {"Content-Type": "text/plain"});
réponse.write(stdout);
réponse.end();
>
);
>

fonction télécharger (réponse) {
console.log("Le gestionnaire de requêtes 'upload' a été appelé.");
réponse.writeHead(200, {"Content-Type": "text/plain"});
réponse.write("Bonjour le téléchargement");
réponse.end();
>

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

De cette façon, lors de la demande de http://localhost:8888/start, le chargement prendra 10 secondes, mais lors de la demande de http://localhost:8888/upload, il répondra immédiatement, même si le /start la réponse est toujours en cours de traitement à l'heure actuelle.

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