Découverte de NodeJS

Florian Journeau
Florian JOURNEAU 11 November 2018
Catégorie : Javascript
Note prises sur suivi de la fomation Grafikart : https://www.grafikart.fr/formations/nodejs
Si vous souhaitez découvrir NodeJS, cet article ne sera pas suffisant, je vous encourage à regarder la formation ou vous rendre sur le site de nodejs.

Tests sur l'installation de NodeJS


Tester si node est installé : node --version

Résultat attendu, la version de Node. (Si résultat différent, erreur d'install).

C:\NodeJS\Tests>node --version
v12.18.0
C:\NodeJS\Tests>


Script serveur Web


Création de notre premier script que l'on va mettre dans un fichier : server.js.
Pour exécuter ce fichier, taper node server.js en exécutant cette commande dans le répertoire où se trouver le fichier server.js bien sûr.

Si je met un console.log('Hello world') dans mon fichier js et que j'exécute, je voir le résultat :

C:\NodeJS\Tests>node server.js
Hello world
C:\NodeJS\Tests>


Création du serveur : fichier server.js

let http = require('http')

let server = http.createServer()

server.on('request', (request, response) => {
    console.log('Il y a eu une requête')
    response.writeHead(200, {
      'Content-type' :  'text/html; charset=utf8;'
    })
    response.end('1ère requête !')

})
server.listen(8080)

On peut désormais se rendre sur la page http://localhost:8080 où on poura voir :
1ère requête !

Coté console, on aura à l'exécution de la requête :

C:\NodeJS\Tests>node server.js
Il y a eu une requête


A noter que la ligne de commande n'est pas revenue. Le script tourne toujours. Pour l'arrêter il faudra faire Ctrl + C.
Et donc, il faudra bien penser a arrêter et redémarer le script pour tester chaque modification de notre fichier server.js.

Example de scripts


Afficher un fichier index.html :

let http = require('http')
let fs = require('fs')

let server = http.createServer()

server.on('request', (request, response) => {
    console.log('Il y a eu une requête')
    fs.readFile('index.html', (err, data) => {
        if (err) {
            response.writeHead('404')
            response.end("Ce fichier n'existe pas")
        } else {

            response.writeHead(200, {
                'Content-type': 'text/html; charset=utf8;'
            })
            response.end(data)
        }
    })
})
server.listen(8080)


Lire des paramètres URL :
http://localhost:8080/?name=Florian va retourner
Bonjour Florian !

let http = require('http')
let fs = require('fs')
let url = require('url')

let server = http.createServer()

server.on('request', (request, response) => {

    response.writeHead(200)
    let query = url.parse(request.url, true).query
    if (query.name === undefined) {
        response.write('Bonjour !')
    } else {
        response.write('Bonjour ' + query.name + ' !')
    }
    response.end()

})
server.listen(8080)


Gestion d'un mini template :
Dans le fichier HTML :

<!DOCTYPE html>
<html lang="fr">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Bienvenue sur le site de test Node</title>
    </head>
    <body>
        <h1>Bonjour {{ name }}</h1>
        <p>
            Lorem ipsum dolor sit amet consectetur adipisicing elit. Iure, facilis? Ullam, cum nulla. Sunt eveniet incidunt
            omnis natus ad blanditiis officiis libero nisi vero veniam reprehenderit, animi odit amet voluptatibus!
        </p>
    </body>
</html>


dans le fichier js :

let http = require('http')
let fs = require('fs')
let url = require('url')

let server = http.createServer()

server.on('request', (request, response) => {

    response.writeHead(200)
    let query = url.parse(request.url, true).query
    name = query.name === undefined ? '' : query.name
        
    console.log('Il y a eu une requête vers index.html')
    fs.readFile('index.html', 'utf8', (err, data) => {
        if (err) {
            response.writeHead('404')
            response.end("Ce fichier n'existe pas")
        } else {

            response.writeHead(200, {
                'Content-type': 'text/html; charset=utf8;'
            })
            data = data.replace('{{ name }}', name)
            response.end(data)
        }
    })
})
server.listen(8080)

Attention subtilité, pour que l'objet data soit bien considéré comme un objet string javascript, il faut préciser l'encodage (utf8) dans la méthode readFile :
fs.readFile('index.html', 'utf8', (err, data) => { ... }, sinon, l'objet data sera considéré comme un objet buffer.
Cf. la documentation de nodeJS pour vérifier comment fonctionne ces fonctions.


Modules javascript


Afin de morceler le code, il est possible d'utiliser des modules :

monModule.js

let my_private_variable = 'This var is only defined in file myModule.js'
let exported_var = 'Hello !'
module.exports = exported_var

script.js

// Appel du fichier monModule.js (situé dans le même répertoire
let newModule = require('./monModule')

console.log(newModule.exported_var) // va afficher : Hello !


NPM (Node Packages Manager)


npm est le gestionnaire de paquets officiel de Node.js.

Pour initialiser un projet, on tape via la commande :

npm init

Une fois les diverses question sur le projet répondues, on constate l'apparition d'un fichier package.json qui sauvegardera les modules à importer.

Pour télécharger un nouveau module

npm install --save <nom_module>

ou en synthaxe abbrégée

npm i -S <nom_module>



Exemple de fichier package.json généré avec npm init

{
  "name": "fjourneau/test_node",
  "version": "1.0.0",
  "description": "test",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node server.js"
  },
  "author": "fJourneau",
  "license": "ISC"
}


On voit qu'il y a une partie scripts avec 2 entrées, startet test.
Maintenant, si on veut exécuter notre script, plutot que de taper node server.js, on va pouvoir directement taper :

npm run start

On pourra également taper la version abrégée npm start.
On peut omettre run si on est sur que le script choisi n'entre pas en collision avec les paramètres existant de npm (c'est le cas pour start).