Routage Node.js


Nous devons fournir l'URL demandée et les autres paramètres GET et POST requis pour la route, puis la route doit exécuter le code correspondant en fonction de ces données.

Par conséquent, nous devons examiner la requête HTTP et extraire l'URL demandée et les paramètres GET/POST. La question de savoir si cette fonction appartient au routage ou au serveur (ou même en tant que fonction du module lui-même) mérite effectivement d'être discutée, mais ici elle est provisoirement considérée comme la fonction de notre serveur HTTP.

Toutes les données dont nous avons besoin seront contenues dans l'objet request, qui est passé comme premier paramètre de la fonction de rappel onRequest(). Mais pour analyser ces données, nous avons besoin de modules Node.JS supplémentaires, qui sont les modules url et querystring.

                   url.parse(string).query
                                           |
           url.parse(string).pathname      |
                       |                   |
                       |                   |
                     ------ -------------------
http://localhost:8888/start?foo=bar&hello=world
                                ---       -----
                                 |          |
                                 |          |
              querystring(string)["foo"]    |
                                            |
                         querystring(string)["hello"]

Bien sûr, nous pouvons également utiliser le module querystring pour analyser les paramètres dans le corps de la requête POST, ce qui sera démontré plus tard.

Ajoutons maintenant un peu de logique à la fonction onRequest() pour connaître le chemin de l'URL demandé par le navigateur :

var http = require("http");
var url = require("url");

function start() {
  function onRequest(request, response) {
    var pathname = url.parse(request.url).pathname;
    console.log("Request for " + pathname + " received.");
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello World");
    response.end();
  }

  http.createServer(onRequest).listen(8888);
  console.log("Server has started.");
}

exports.start = start;

D'accord, notre application peut maintenant transmettre le chemin de l'URL demandé pour différencier les différents requêtes - cela nous permet d'utiliser le routage (pas encore terminé) pour mapper les requêtes aux gestionnaires en fonction des chemins d'URL.

Dans l'application que nous construisons, cela signifie que les requêtes de /start et /upload peuvent être traitées avec un code différent. Nous verrons comment cela s’articule plus tard.

Maintenant, nous pouvons écrire la route. Créez un fichier nommé router.js et ajoutez le contenu suivant :

function route(pathname) {
  console.log("About to route a request for " + pathname);
}

exports.route = route;

Comme vous pouvez le voir, quel est ce code ? je ne l'ai pas fait non plus, mais pour l'instant, c'est ce que cela devrait être. Avant d'ajouter plus de logique, voyons d'abord comment intégrer le routage et les serveurs.

Nos serveurs doivent être conscients de l'existence des routes et les utiliser efficacement. Nous pourrions bien sûr coder en dur cette dépendance sur le serveur, mais l'expérience de la programmation dans d'autres langages nous dit que ce serait pénible, nous utiliserons donc l'injection de dépendances pour ajouter vaguement le module de route.

Tout d'abord, étendons la fonction start() du serveur pour passer la fonction de routage en paramètre server.js Le code du fichier est le suivant

var http = require("http");
var url = require("url");

function start(route) {
  function onRequest(request, response) {
    var pathname = url.parse(request.url).pathname;
    console.log("Request for " + pathname + " received.");

    route(pathname);

    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello World");
    response.end();
  }

  http.createServer(onRequest).listen(8888);
  console.log("Server has started.");
}

exports.start = start;

En même temps. temps, nous Index.js serons étendus en conséquence afin que les fonctions de routage puissent être injectées dans le serveur :

var server = require("./server");
var router = require("./router");

server.start(router.route);

Ici, la fonction que nous passons ne fait toujours rien.

Si vous démarrez l'application maintenant (node ​​​​index.js, souvenez-vous toujours de cette ligne de commande) puis demandez une URL, vous verrez l'application afficher les informations correspondantes, ce qui indique que notre serveur HTTP est déjà en utilisant le module de routage, et transmettra le chemin demandé à la route :

$ node index.js
Server has started.

La sortie ci-dessus a supprimé les parties ennuyeuses liées à la requête /favicon.ico.

Accès au navigateur http://127.0.0.1:8888/, le résultat de sortie est le suivant :

251.jpg