Les langages du web > Le Javascript

Node.js

Installation

Ce mini-cours est un résumé du w3schools.com/nodejs

Node.js permet de disposer d'un petit serveur web, léger et rapide, sur son ordinateur. Il permet :

Ici, le JS est utilisé comme le PHP, un langage permettant de donner des instructions au serveur. Apache est un (gros) serveur pour PHP, Node.js est un (petit) serveur pour JS. Cependant, ici JS, contrairement au PHP, utilise la programmation asynchrone, c-à-d qu'il lance la requête suivante avant de recevoir la réponse à la première requête.

Les fichiers contenant les instructions au serveur Node.js utilisent la syntaxe de JS.

Le code JS destiné au navigateur et celui destiné au serveur sont mis dans deux fichiers distincts (d'extension .js). Ils peuvent co-exister dans un même dossier.
Le navigateur est le client du serveur.

Un fichier d'extension .js utilisé coté-client est appelé par du code HTML. Mais, ici, il doit être lancé ...

Après téléchargement de Node.js sur le site officiel et son installation, pour lancer ce type de fichier (codé en JS), il faut ouvrir une console (dans le dossier le contenant) et taper (après le prompt) : node nom_du_fichier. Par exemple :

node myfirst.js

Exemple. Contenu de myfirst.js :

var http = require('http');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.end('Hello World!');
}).listen(8080);

Puis, de taper dans la barre des URLs du navigateur : http://localhost:8080

Pour éteindre le serveur, il suffit de retourner dans le terminal et taper CTRL+C.

Lancement du serveur

Si la variable d'environnement PATH a été correctement configurée (automatiquement lors de l'installation), le serveur peut être lancé dans n'importe quel dossier du disque dur (via un terminal)

Si, après le prompt, est simplement tapé node, s'affiche le numéro de la version et la commande à utiliser pour obtenir de l'aide.

Welcome to Node.js v14.16.0.
Type ".help" for more information.
>

Si est tapé .help, s'affiche :

.break    Sometimes you get stuck, this gets you out
.clear    Alias for .break
.editor   Enter editor mode
.exit     Exit the REPL
.help     Print this help message
.load     Load JS from a file into the REPL session
.save     Save all evaluated commands in this REPL session to a file

Press Ctrl+C to abort current expression, Ctrl+D to exit the REPL
>

Un module est un ensemble de fonctions. Lors de l'installation de Node.js un certain nombre de modules (built-in) sont installés. Cette liste peut dépendre de la version de Node.js. Toutefois, les modules les plus courants sont les mêmes que ceux des versions anciennes.

Il existe même un module (à installer) qui permet d'obtenir cette liste. Plus d'info
On peut également créer ses propres modules.

require()

Pour inclure un module, il suffit d'utiliser la fonction require() avec le nom du module. Par exemple :

var http = require('http');

Il est possible de créer ses propres modules. Exemple de code ("myfirstmodule.js") :

exports.myDateTime = function () {
  return Date();
};

Il suffit d'utiliser le mot clé exports pour que la méthode ou la propriété soit accessible hors du module (par le fichier contenant le code l'appelant)

Exemple de code incluant myfirstmodule.js :

var http = require('http');
var dt = require('./myfirstmodule');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write("The date and time are currently: " + dt.myDateTime());
  res.end();
}).listen(8080);

./ indique que le fichier appelé (sans l'extension .js) est dans le même dossier que le fichier l'appelant.

Module http

Le module http permet de créer un micro serveur HTTP.

var http = require('http');

/* create a server object: */
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write('Hello World!'); /* write a response to the client */
  res.end(); /* end the response */
}).listen(8080); /* the server object listens on port 8080 */

Le serveur HTTP ainsi créé est un objet ...

Le paramètre de la méthode .createServer() est une fonction qui est exécutée lorsque "quelqu'un" écoute sur le port 8080.

Bien que facultative, mieux vaut ajouter la ligne
res.writeHead(200, {'Content-Type': 'text/html'});
si le client est un navigateur web.

res est l'objet envoyé au client (la réponse).

req est l'objet envoyé par le client (sa requête). Cet objet dispose de la propriété .url (qui contient la valeur de ce qui est dans la barre d'URL du navigateur).

var http = require('http');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write(req.url);
  res.end();
}).listen(8080);

L'extraction des paramètres d'une URL (tel que ...?year=2017&month=July) implique l'inclusion du module url.

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

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  var q = url.parse(req.url, true).query;
  var txt = q.year + " " + q.month;
  res.end(txt);
}).listen(8080);

La méthode .end peut contenir un paramètre, la réponse à envoyer.

Module fs

Le module fs permet d'accéder au File System (gestionnaire de fichiers) de votre ordinateur.

Code valable pour ouvrir tout fichier index.htm (indexNode.js) :

var http = require('http');
var fs = require('fs');

http.createServer(function (req, res) {
  fs.readFile('index.htm', function(err, data) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(data);
    return res.end();
  });
}).listen(8080);

L'objet fs dispose de la méthode .readFile().

Autres méthodes : .appendFile(), .open(), .writeFile(), .unlink(), .rename(), ...

Cependant, la manipulation de fichiers peut aussi être faite en Python (ou en C, ...)
Plus d'info sur ces manipulations via Node.js

Module url

Le module url permet d'utiliser la méthode .parse() qui permet d'obtenir les différentes parties d'une URL.

var url = require('url');
var adr = 'http://localhost:8080/default.htm?year=2017&month=february';
var q = url.parse(adr, true);

console.log(q.host);      /* returns 'localhost:8080' */
console.log(q.pathname);  /* returns '/default.htm' */
console.log(q.search);    /* returns '?year=2017&month=february' */

var qdata = q.query;      /* returns an object: { year: 2017, month: 'february' } */

console.log(qdata.month); /* returns 'february' */

Code pour ouvrir toute page HTML
(dont l'url est indiquée dans la barre des URLs du navigateur)

var http = require('http');
var url = require('url');
var fs = require('fs');

http.createServer(function (req, res) {
  var q = url.parse(req.url, true);
  var filename = "." + q.pathname;
  fs.readFile(filename, function(err, data) {
    if (err) {
      res.writeHead(404, {'Content-Type': 'text/html'});
      return res.end("404 Not Found");
    }
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(data);
    return res.end();
  });
}).listen(8080);

NPM

NPM est un gestionnaire de package (modules), installé lors de l'installation de Node.js.

Des milliers de modules peuvent être trouvés sur npmjs.com.

Pour installer un package, il suffit de taper npm install suivi du nom du package dans le terminal ouvert dans le dossier choisi (...\threeJS). Par exemple :

npm install three

S'affiche (après 56 secondes) :

npm WARN saveError ENOENT: no such file or directory, open '...\threeJS\package.json'
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN enoent ENOENT: no such file or directory, open '...\threeJS\package.json'
npm WARN threeJS No description
npm WARN threeJS No repository field.
npm WARN threeJS No README data
npm WARN threeJS No license field.

+ three@0.157.0
added 1 package from 1 contributor and audited 1 package in 56.626s
found 0 vulnerabilities

et ont été créés dans ce dossier (...\threeJS) :