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 :
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 :
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 :
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 :
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.