Nous voulons passer l'objet de réponse (soyez de la fonction de rappel du serveur OnRequest ()) au gestionnaire de requête via le routage de la demande. Le gestionnaire peut ensuite utiliser les fonctions de l'objet pour répondre à la demande.
Apportons d'abord des modifications à server.js:
La copie de code est la suivante:
var http = require ("http");
var url = require ("url");
Fonction Start (route, manche) {
fonction onRequest (demande, réponse) {
var pathname = url.parse (request.url) .pathname;
console.log ("Demande pour" + pathname + "reçu.");
route (manche, cheminement, réponse);
}
http.createServer (onRequest) .Listen (8888);
console.log ("Server a commencé.");
}
export.start = start;
Nous transmettons l'objet de réponse comme troisième paramètre à la fonction Route (), et nous supprimons tout l'appel de réponse dans le gestionnaire onRequest () parce que nous voulons que cette partie de l'œuvre laisse la fonction Route () terminer.
Ensuite, modifiez Router.js:
La copie de code est la suivante:
Route de fonction (poignée, cheminement, réponse) {
console.log ("sur le point d'acheter une demande pour" + pathname);
if (typeof handle [pathname] === 'function') {
manipuler [pathname] (réponse);
} autre {
console.log ("Aucun gestionnaire de demande trouvé pour" + pathName);
Response.WriteHead (404, {"Content-Type": "Text / PLAIN"});
Response.Write ("404 non trouvé");
réponse.end ();
}
}
export.Route = Route;
Le même schéma: par rapport à l'acquisition précédente de la valeur de retour du gestionnaire de requête, cette fois à la place, il a directement passé l'objet de réponse. S'il n'y a pas de processeur de demande correspondant pour le gérer, nous retournerons directement l'erreur "404".
Ensuite, modifiez requesthandler.js:
La copie de code est la suivante:
var exec = require ("child_process"). exec;
fonction start (réponse) {
Console.log ("Demande Handler 'Start' a été appelé.");
exec ("ls -lah", fonction (erreur, stdout, stderr) {
Response.WriteHead (200, {"Content-Type": "Text / Plain"});
Response.Write (STDOUT);
réponse.end ();
});
}
Fonction téléchargement (réponse) {
Console.log ("Demande Handler 'Upload' a été appelé.");
Response.WriteHead (200, {"Content-Type": "Text / Plain"});
réponse.write ("Bonjour téléchargement");
réponse.end ();
}
export.start = start;
exports.upload = upload;
Notre fonction de gestionnaire doit recevoir le paramètre de réponse afin de répondre directement à la demande. Le gestionnaire de démarrage effectue une opération de réponse de demande dans la fonction de rappel anonyme d'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 l'opération chronophage dans le gestionnaire / start ne bloquera pas la réponse immédiate à la demande / téléchargement, vous pouvez modifier requestHandlers.js au formulaire suivant:
La copie de code est la suivante:
var exec = require ("child_process"). exec;
fonction start (réponse) {
Console.log ("Demande Handler 'Start' a été appelé.");
exec ("find /",
{Timeout: 10000, Maxbuffer: 20000 * 1024},
fonction (erreur, stdout, stderr) {
Response.WriteHead (200, {"Content-Type": "Text / Plain"});
Response.Write (STDOUT);
réponse.end ();
}
));
}
Fonction téléchargement (réponse) {
Console.log ("Demande Handler 'Upload' a été appelé.");
Response.WriteHead (200, {"Content-Type": "Text / Plain"});
réponse.write ("Bonjour téléchargement");
réponse.end ();
}
export.start = start;
exports.upload = upload;
De cette façon, lors de la demande de http: // localhost: 8888 / start, il faudra 10 secondes pour charger, et lors de la demande de http: // localhost: 8888 / téléchargement, il répondra immédiatement, même si la réponse / début est toujours traitée à ce moment.