Cours Node.js Cours Node.js - Séance 1 - Chat-bot avec Express

Objectifs de cette séance

Durée estimée cours + exercices: 6 heures.

Pré-requis

Important: Si vous êtes sous Windows, merci d’utiliser exclusivement le terminal bash Ubuntu installé après avoir activé Windows Subsystem for Linux, CMDER ou d’utiliser Linux depuis une machine virtuelle. Sous Mac ou Linux, vous serez en mesure d’utiliser votre terminal par défaut.

Pour effectuer ces exercices, assurez-vous que les pré-requis suivants sont bien installés et accessibles depuis votre terminal bash (ou compatible):

Note: si vous avez installé Node.js sous Windows, il se peut que node ou npm ne fonctionnent pas depuis Ubuntu for Windows. Dans ce cas: désinstallez Node.js, installez-le depuis Ubuntu (cf procédure), puis redémarrez Ubuntu.

Exercice 1.1 - Hello World

Le but est de développer et mettre en production un serveur web/API basique qui répondra systématiquement “Hello World” à tous les clients qui enverront une requête HTTP GET au chemin /hello.

Critères de validation

Étapes proposées

Ces étapes supposent que vous avez accès à un terminal Bash (ou compatible) dans lequel node est installé, et git est configuré avec votre identité d’étudiant·e.

  1. Créer un dépôt sur l’hébergeur git de votre école, clonez-le sur votre disque-dur (git clone <url_du_projet>), puis n’oubliez pas d’entrer dans le répertoire qui a été créé par git clone
  2. Créer une application Node.js (ex: fichier server.js) qui affiche “Hello World” dans la sortie standard. (1 ligne de code)
  3. Créer un premier git commit avec ce fichier puis l’uploader sur votre dépôt distant. (git push)
  4. Initialiser package.json avec npm init puis ajouter la dépendance express à l’aide de npm install avec l’option --save.
  5. Modifier le fichier server.js de manière à ce que l’application Node.js démarre un serveur HTTP qui réponde “Hello World” quand on lui envoie une requête GET.
  6. Mettre le serveur en production en le déployant sur votre compte Heroku.
  7. Modifier le serveur pour qu’il puisse se lancer sur le port défini par la variable d’environnement PORT fournie par Heroku, avec une valeur par défaut à 3000 pour l’execution en local.
  8. Créer une “release” v1.1 pour garder une trace de cette version du serveur dans votre dépôt, avec $ git tag v1.1, puis assurez-vous qu’elle soit visible depuis l’hébergeur de dépôts git de l’école.

Documentation pour vous aider: Install Express, Specify port for Heroku

Pro tip: Le répertoire node_modules (créé par npm install à l’étape 3) ne doit jamais être inclus dans les commits d’un dépôt git. Pour ajouter ce répertoire à la liste des répertoires et fichiers ignorés par git, taper $ echo node_modules >>.gitignore.

Pro tip 2: En cas de problème pour installer la commande heroku (cf étape 5), vous pouvez essayer $ npm install --global heroku, ou encore $ npm install heroku puis ./node_modules/.bin/heroku.

Pro tip 3: Si $ git push heroku master ne fonctionne pas ou ne pousse pas vos commits vers la bonne application Heroku, exécutez les commandes suivantes:

    $ git remote -v
    $ git remote rm heroku
    $ heroku create
    $ git remote add heroku <URL GIT RETOURNÉE PAR HEROKU>
    $ git push heroku master

Une fois que vous aurez terminé cet exercice, merci d’aider vos camarades qui auraient des difficultés.

Exercice 1.2 - Chat-bot

Le but est que notre API développée dans l’exercice précédent puisse également répondre un message pertinent à chaque message envoyé par les utilisateurs via le corps d’une requête HTTP POST.

Pour cela, nous allons y ajouter un point d’entrée (endpoint) de méthode POST au chemin /chat. Celui-ci pourra adapter sa réponse en fonction du contenu passé avec chaque requête. Le contenu devra être passé au format JSON, et le message de l’utilisateur devra être transmis comme valeur de la propriété msg.

Exemples / cas d’usage:

Critères de validation

Étapes proposées

  1. Ajouter le point d’entrée, sans modifier celui que nous avons développé à l’exercice précédent.
  2. Faire en sorte que ce point d’entrée retourne le contenu passé avec la requête, tel quel, quel que soit son format.
  3. Modifier l’implémentation du point d’entrée pour afficher seulement la valeur de la propriété msg du contenu passé au format JSON.
  4. Modifier l’implémentation du point d’entrée pour que les cas d’usages listés ci-dessus soient remplis.
  5. Déployer une mise à jour de votre serveur en production.
  6. Créer une nouvelle “release” pour garder une trace de cette version du serveur dans votre dépôt: $ git tag v1.2.

Documentation de Express: https://expressjs.com/fr/starter/basic-routing.html

Une fois que vous aurez terminé cet exercice, merci d’aider vos camarades qui auraient des difficultés.

BONUS: Ajouter un point d’entrée GET à la racine du serveur (chemin: /) qui retourne une page HTML permettant aux utilisateurs d’envoyer des messages plus facilement, à l’aide d’un formulaire.

Exercice 1.3 - Chat-bot avec mémoire

Nous avons à présent un serveur web dont l’API contient deux points d’entrée (endpoints):

Nous voulons désormais que notre chat-bot soit capable d’apprendre de nouvelles informations lors des échanges avec les utilisateurs, et d’exploiter ces informations pour mieux répondre lors des prochains échanges.

Exemples de conversation / cas d’usage:

  1. $ curl -X POST --header "Content-Type: application/json" --data "{\"msg\":\"demain\"}" http://localhost:3000/chat répondra “Je ne connais pas demain…”
  2. $ curl -X POST --header "Content-Type: application/json" --data "{\"msg\":\"demain = Mercredi\"}" http://localhost:3000/chat répondra “Merci pour cette information !”
  3. $ curl -X POST --header "Content-Type: application/json" --data "{\"msg\":\"demain\"}" http://localhost:3000/chat répondra “demain: Mercredi” (y compris après redémarrage du serveur)

Pour cela, nous allons:

Critères de validation

Étapes proposées

  1. Faire en sorte que le point d’entrée /chat enregistre la clé (ex: “demain”) et la valeur (ex: “Mercredi”) fournies par l’utilisateur dans la fichier réponses.json, lorsque celui-ci fournit une nouvelle information. (étape 2 du cas d’usage)
  2. Faire en sorte que, après avoir fourni une information, l’utilisateur puisse retrouver cette information en formulant une requête (cf étape 3 du cas d’usage), grâce au fichier réponses.json.
  3. Faire en sorte que toutes les étapes du cas d’usage fonctionne, plusieurs fois d’affilée, y compris avec d’autres mots que “demain” et d’autres valeurs que “Mercredi”. S’assurer que les nouvelles informations sont encore exploitables même après avoir redémarré le serveur.
  4. Déployer une mise à jour de votre serveur en production.
  5. Créer une nouvelle “release” pour garder une trace de cette version du serveur dans votre dépôt: $ git tag v1.3.

Références Node.js et JavaScript: readFileSync(), writeFileSync(), JSON.parse(), JSON.stringify(), String.split(), Manipulations de tableaux.

BONUS:

Étude: appels synchrones et asynchrones

Questions sur lesquelles réfléchir:

Exercice 1.4: audit d’API

Le but de cet exercice est d’auditer l’API de l’étudiant qui se trouve assis à votre gauche, afin d’y trouver des bugs, failles de sécurité et autres limitations.

Vous devrez envoyer un court rapport de votre audit à l’enseignant, contenant pour chaque trouvaille les informations suivantes:

N’oubliez pas d’inclure à votre rendu:

L’un de vous viendra présenter son audit en début de la prochaine séance.

Suggestions: Pour vous aider à identifier les limitations, vous pouvez utiliser un débogueur Node.js (ex: ndb ou Visual Studio Code), des scripts Bash lançant plusieurs requêtes d’affilée, et/ou un outil de test de charge (ex: Apache Benchmark). Vous pouvez aussi repérer certaines limitations (ex: cas limites) en lisant attentivement le code de votre camarade.

Pour aller plus loin

💡 Avec l’aide de Node.js, il est possible de programmer un chat-bot contactable via Facebook Messenger, ou tout autre plateforme de messagerie instantanée. Il est aussi possible de déployer sur d’autres hébergeurs Cloud que Heroku.

Liens: