title | layout |
---|---|
Partie 4 - Persistance de données avec MongoDB |
default |
- Apprendre à stocker et récupérer des données dans une base de données MongoDB
- Étendre le chat-bot pour retrouver l'historique des conversations
Durée estimée: 3-6 heures.
Pour effectuer ces exercices, assurez-vous que les pré-requis suivants sont bien installés et accessibles depuis votre shell Linux:
node
; (tester avec$ node --version
)curl
; (tester avec$ curl --version
)
Il existe (au moins) trois manières de procéder:
Il suffit de créer un compte sur MongoDB Atlas puis de suivre les étapes proposées pour créer (puis tester) une base de données basée sur la plateforme "Azure".
À vérifier en cas de difficultés: il est possible que cette connexion soit rendue impossible par votre pare-feu ou par le réseau de votre école.
Si Docker fonctionne bien sur votre machine, lancer le serveur MongoDB via une image Docker, en suivant ces étapes:
- Télécharger et exécuter l'image Docker du serveur de MongoDB avec la commande suivante:
$ docker run --rm --publish 27017:27017 --name mongodb-pour-nodejs mongo:4
- Tester la connection au serveur MongoDB en exécutant cette commande:
$ docker run --rm -it --link mongodb-pour-nodejs:mongo mongo:4 mongo --host mongo test
Sinon: installer, configurer et lancer un serveur MongoDB sur votre machine, en suivant ces étapes:
-
Installer MongoDB Server, community edition sur votre machine, et de manière à ce qu'il soit accessible depuis votre shell Linux.
-
Après avoir redémarré votre shell Linux, si la commande
mongod
est introuvable, ajoutez le répertoire créé dans la variablePATH
de votre système d'exploitation, en suivant les instructions de Install MongoDB. -
Comme indiqué dans les instructions de Run MongoDB, créez un répertoire
/data/db
et assurez-vous qu'il sera accessible àmongod
en donnant les permissions nécessaires:$ sudo chmod 777 /data/db
. -
Ensuite, vous devriez être en mesure de lancer le serveur
mongod
, et de vous y connecter à l'aide du clientmongo
, depuis une autre session de shell Linux. (cf étapes ci-dessous)
Dans une session de shell Linux, utiliser le client "mongo
Shell" pour vérifier que la base de données est bien accessible. Il suffit de taper mongo
suivi de l'URL du serveur.
Une fois connecté au serveur via l'invite de commandes du client mongo
, la commande show dbs
devrait afficher une liste de bases de données.
Pressez Ctrl-C pour quitter le client et retourner à l'invite de commandes du shell Linux.
Dans cet exercice, nous allons découvrir comment manipuler une base de données MongoDB depuis un programme Node.js, à l'aide du package mongodb
. (anciennement connu sous le nom de "MongoDB Native Driver for Node.js")
Nous allons écrire un programme Node.js qui va:
- se connecter à une base de données MongoDB;
- afficher tous les documents stockés dans la collection "
dates
"; - ajouter un document
{ date: new Date() }
dans cette collection.
Utiliser await
pour tous les appels asynchrones à la base de données.
Le code source devrait tenir sur une quarantaine de lignes.
-
Initialiser un serveur de base de données MongoDB. (cf Comment disposer d'un serveur MongoDB ?, plus haut)
-
Vérifier que vous parvenez bien à vous connecter à ce serveur depuis votre shell Linux. (cf Comment tester la connection à un serveur MongoDB ?, plus haut)
-
Initialiser un projet Node.js dans un répertoire vide, installer le package
mongodb
avec npm, et vérifier qu'il a bien été ajouté au fichierpackage.json
du projet. -
Créer et faire fonctionner un programme
dates.js
qui se sert du packagemongodb
pour se connecter à la base de données créée à l'étape 1. (cf Connecting)Note: Vous pouvez ignorer le message disant que la méthode de connexion est dépréciée. Par contre, votre programme devrait pouvoir s'exécuter sans erreur.
-
Modifier
dates.js
pour qu'il affiche la liste des documents de la collectiondates
dans la sortie standard. Initialement, cette liste sera un tableau vide.Documentation: Read methods
-
Ajouter dans
dates.js
les instructions nécéssaires pour ajouter un document{ date: new Date() }
dans la collectiondates
, avant l'affichage des documents de cette même collection.Documentation: Inserting documents
Une fois que vous aurez terminé cet exercice, merci d'aider vos camarades qui auraient des difficultés.
Dans cet exercice, nous allons compléter le serveur "chat-bot" que nous avons développé jusqu'à l'exercice 5 de la partie 1 du cours, de manière à:
- tenir un historique des messages envoyés au point d'accès
POST /chat
et de leurs réponses, dans une collection MongoDB; - et donner accès à cet historique via deux nouveaux points d'accès:
GET /messages/all
etDELETE /messages/last
.
Utiliser await
pour tous les appels asynchrones.
Le code source devrait tenir sur une centaine de lignes.
Fournir un fichier README.md
décrivant les 3 commandes (max.) nécessaires pour télécharger et faire fonctionner ce serveur depuis une autre machine.
$ curl -X POST --header "Content-Type: application/json" --data "{\"msg\":\"ville\"}" "http://localhost:3000/chat"
répondra "Nous sommes à Paris" (comme précedemment)$ curl -X GET "http://localhost:3000/messages/all"
affichera l'historique des conversations (messages de l'utilisateur et réponses du chat-bot), tel que décrit ci-dessous, y compris après redémarrage du serveur$ curl -X DELETE "http://localhost:3000/messages/last"
supprimera le dernier échange de l'historique (message de l'utilisateur + réponse du chat-bot)
Notre serveur doit retourner l'historique sous forme d'un tableau JavaScript contenant tous les messages echangés, dans l'ordre chronologique.
En guise d'exemple, voici ce que devrait retourner le serveur si on requête GET /messages/all
après avoir suivi le cas d'usage ci-dessus:
[
{
"from": "user",
"msg": "demain"
},
{
"from": "bot",
"msg": "Demain: Mercredi"
}
]
Chaque message reçu ou répondu par le chat-bot doit être représenté par un document défini par les trois propriétés suivantes:
_id
(type:ObjectId
): un identifiant unique, généré automatiquement par MongoDB pour chaque message;from
(type:string
): l'émetteur du message,bot
ouuser
;msg
(type:string
): le contenu du message. (ex:demain = Mercredi
)
- Modifier
server.js
pour qu'il se connecte à la base de données. - Implémenter et tester le point d'accès
GET /messages/all
. (il devrait retourner un tableau vide) - Faire en sorte que ce point d'accès retourne l'historique des conversations => Enregistrer les messages de l'utilisateur et les réponses du chat-bot dans la collection
messages
. - Implémenter le point d'accès
DELETE /messages/last
, et vérifier à l'aide d'une requête àGET /messages/all
qu'il fonctionne bien comme prévu. - Rédiger la documentation demandée dans
README.md
.
Le but de cet exercice est de mettre le serveur développé ci-dessus en production, afin qu'il soit accessible en permanence et à quiconque sur internet.
- Enregistrer l'URL d'accès à votre base de données MongoDB dans une variable d'environnement de votre application sur Heroku:
MONGODB_URI
. - Modifier
server.js
pour qu'il parvienne à se connecter à cette base de données, que celui-ci s'exécute en production ou en local, grâce à cette variable d'environnement. - Documenter les points d'accès de votre API dans
README.md
, afin que d'autres utilisateurs comprennent rapidement comment l'utiliser, que ce soit en production ou localement.
- Utiliser OpenAPI pour documenter votre API => ajouter le modèle au format YAML dans votre dépôt.
- Utiliser l'ORM/ODM "Mongoose" pour manipuler la base de données, au lieu du package
mongodb
. => Expliquez l'impact de ce changement: avantages et inconvénients, en supposant que votre application soit destinée à se développer. - Expliquez comment procéder si jamais la structure de votre base de données (aussi appelée "schema") est amenée à changer d'une version à l'autre de votre application. Comment éviter tout conflit de versions entre la structure des données en base de données et celle qui est reconnue par le programme, et tout bug ou crash que cela pourrait provoquer.
- Spécification, documentation et instrumentalisation d'API: OpenAPI et Swagger
- Alternative moderne aux APIs REST: GraphQL