|
|
M2 Miage NTDP : Server Side JS, MongoDB, frameworks JSDe $1Table des matières
Séance 1 - présentation de NodeJS et premiers exercices simples
Ressource : des MOOCS!
Il y a d'excellents cours JS avancés sur udacity.com (je recommande pour ceux qui se débrouillent pas mal celui-ci: https://www.udacity.com/course/objec...ascript--ud015) TP - routage avec le module ExpressJS, Web Services RESTFULSupports de cours: transparents de présentation de Express
TP - MongoDB
1 - Installer MongoDB sur votre machineSuivez les installations propres à votre système d'exploitation situées sur cette page du site officiel. Ne choisissez pas l'installation manuelle. Sur mon Mac j'ai fait:
2 - Créer et peupler une collection par défaut (avec un dataset issu du tutorial MongoDB officiel)
3 - Installer un outil d'administration sympaJe vous recommande fortement MongoChef, un produit commercial mais gratuit pour utilisation non commerciale. Le télécharger sur: http://3t.io/mongochef/ 4 - Ouvrir MongoChef et voir la collection que l'on vient d'importer
Quelques screenshots:
5 - Installer le driver MongoDB pour NodeJS
Ca doit télécharger le module driver mongodb dans un sous-répertoire 5bis pour RabatMercredi Récupérez les fichiers suivants:
Jeudi:
Vendredi:
Corrections pour le count et pour le findByName: Voir la doc de MongoDB pour les requêtes comprenant des expressions régulières: https://docs.mongodb.com/manual/refe...r/query/regex/ Dans serverCrudWithMongo.js: // ICI c'est autorisé par la norme REST car
// "count" est un mot réservé, on ne risque pas de
// le prendre pour une TABLE ou une collection
// cf la partie "reserved words" de
// https://blog.octo.com/designer-une-api-rest/
app.get('/api/restaurants/count', function(req, res) {
// on renvoie le nombre de restaurants
mongoDBModule.countRestaurants(function(data) {
var objdData = {
msg:"Count effectué avec succès",
data: data
}
res.send(JSON.stringify(objdData));
});
});
// On va récupérer des restaurants par un GET (standard REST)
// cette fonction d'API peut accepter des paramètres
// pagesize = nombre de restaurants par page
// page = no de la page
// Oui, on va faire de la pagination, pour afficher
// par exemple les restaurants 10 par 10
app.get('/api/restaurants', function(req, res) {
// Si présent on prend la valeur du param, sinon 1
let page = parseInt(req.query.page || 0);
// idem si present on prend la valeur, sinon 10
let pagesize = parseInt(req.query.pagesize || 10);
let nom = req.query.nom;
if(nom) {
// find by name
mongoDBModule.findRestaurantsByName(nom, page, pagesize, function(data) {
var objdData = {
msg:"restaurant recherchés par nom avec succès",
data: data
}
res.send(JSON.stringify(objdData));
});
} else {
// find normal
mongoDBModule.findRestaurants(page, pagesize, function(data) {
var objdData = {
msg:"restaurant recherchés avec succès",
data: data
}
res.send(JSON.stringify(objdData));
});
}
});
Dans app_modules/crud-mongo.js: exports.countRestaurants = function(callback) {
console.log("DANS COUNT")
MongoClient.connect(url, function(err, db) {
db.collection('restaurants')
.count(function(err, res) {
console.log("COUNT = " + res)
callback(res);
});
});
};
exports.findRestaurantsByName = function(nom,page, pagesize, callback) {
MongoClient.connect(url, function(err, db) {
console.log("pagesize = " + pagesize);
console.log("page = " + page);
console.log("FIND BY NAME nom=" + nom);
// syntaxe recommandée
// Cf doc mongodb: https://docs.mongodb.com/manual/reference/operator/query/regex/
// The $regex value needs to be either the string
// pattern to match or a regular expression object.
// When passing a string pattern, you don't include
// the / delimitters
// VERSION avec $regexp et $options
let myquery = {
"name": {
$regex: ".*" + nom + ".*",
$options:"i"
}
}
// VERSION avec objet RegExp
//let myquery = {'name' : new RegExp('^.*'+nom+'.*$',"i")};
// ou, si on veut être "case sensitive"
//let myquery = {'name' : new RegExp('^.*'+nom+'.*$')};
if(!err){
db.collection('restaurants')
.find(myquery)
.skip(page*pagesize)
.limit(pagesize)
.toArray()
.then(arr => callback(arr));
}
else{
callback(-1);
}
});
};
6 - Tester des bouts de code JavaScript qui font le CRUD dans cette baseSuivre la suite du tutorial MongoDB, en commençant par la page montrant comment se connecter à la base restaurant. Vous devez copier/coller le code dans un fichier
var MongoClient = require('mongodb').MongoClient;
var assert = require('assert');
var url = 'mongodb://localhost:27017/test';
MongoClient.connect(url, function(err, db) {
assert.equal(null, err);
console.log("Connected correctly to server", url);
db.close();
});
Vous le testerez en exécutant Vous passerez ensuite à la page de tutorial suivante, et ainsi de suite... Chaque page va vous proposer des bouts de code JavaScript pour chercher, modifier, supprimer et insérer des données dans la base des restaurants. Je vous conseille à chaque fois de faire un fichier différent et le tester ensuite avec la commande node:
Correction de cette partie:
7 - Intégrer le code dans une application Node/Express qui fait du routage
VERSION FAITE EN COURS LE MARDI 3/10/2017, qui pourra vous aider: FindServerNextButtonTable.zip, regarder aussi les exemples dans le cours JavaScript Intro sur edX.org. Partie sur DOM (Week 2) et API table HTML (Week 5). TP à rendre pour la prochaine séance !Vous devrez insérer le code qui fait le CRUD dans MongoDB dans les fonctions de routage vues lors du cours sur Express. Vous renverrez les résultats en JSON. Pour les POSTs vous devrez produire un formulaire et vous pourrez tester dans un premier temps les updates et delete via GET, en tapant l'URL dans votre navigateur. Allez-y incrémentalement, petit à petit.
Corrections du TP à rendrePour tester ces correction, dezipper les archives, aller dans le répertoire, executer "npm install" puis node server.js. S'assurer avant qu'on a bien lancé mongodb (en exécutant "mongod" dans un autre terminal).
Séance 3: rappels JavaScript objet et asyncrhone, introduction aux frameworksLes classes ou pseudo classes en JavaScript
Ressources pour l'héritage :
Introduction aux frameworks
Introduction à ReactJSA faire avant le TP:
A faire pour la séance de vendredi :
|
Powered by MindTouch Deki Open Source Edition v.8.08 |