All rights reserved © Pierstoval
Moon art from Lawlie.
(Support artists by paying them)
Background from Solar System Scope

vendredi 25 novembre 2016

[Learning Sails] #1 - L'appréhension

J'avais commencé à utiliser NodeJS il y a deux ans pour découvrir un peu l'architecture. Vu que c'est du Javascript, je me suis dit que ça pourrait le faire.
Erreur !
Il y a énormément de concepts nouveaux qui diffèrent totalement du PHP que je maîtrise aujourd'hui.

Et du coup, depuis 2 ans, je n'ai pas fait grand chose avec NodeJS à part un petit Gulpfile, justement pour Gulp.

J'avais aussi tenté de découvrir Express, mais voyant la complexité (websockets, middlewares, tout asynchrone...) j'ai vraiment eu du mal à continuer.

Du coup, je me suis lancé il y a quelques semaines dans SailsJS, après presque deux ans d'apprentissage infructueux...


Tout part d'un jeu de Snake multijoueur que j'avais développé lors du Hackaton KNPLabs en Octobre avec trois développeurs de talent, visible sur sa page Github : https://github.com/KnpLabs/Sn4k3.

Développé avec un backend en PHP avec ReactPHP, un frontend en javascript + Canvas grâce à http://phaser.io/. Et pour connecter le tout, un "middleware" nommé crossbar.io pour permettre l'interaction entre les deux via des websockets.

Pour moi c'est d'une complexité sans nom, surtout étant donné le nouveau paradigme qui se présente.

Je savais déjà que l'on pouvait faire des choses de façon asynchrone avec Javascript (j'ai expérimenté ExtJS sur une vieille appli à maintenir, et c'est une vraie plaie...), mais là, il y a des notions de pile de middlewares, le concept même de websocket est parfois difficile à assimiler pour un néophyte. Et quand il est exacerbé par des systèmes entièrement asynchrones, c'est dur...

L'installation


Loin de moi l'idée de faire un tuto, je vais plutôt parler de ce que j'ai vécu.

L'installation de Sails, c'est un peu comme quand on achète un nouveau PC tout neuf, et que dessus, on a Linux au lieu de Windows comme à l'accoutumée. On trouve ça beau, reluisant, c'est l'excitation de la nouveauté, et on est tout fier.

Juste après, c'est le sérieux qui revient. On découvre les dizaines de dossiers, les concepts nouveaux qui débarquent (les blueprints par exemple), le framework a l'air puissant et l'application standard est relativement bien faite.

L'ORM : tout asynchrone (pour le meilleur, mais surtout pour le pire, enfin surtout pour moi)


J'ai commencé à avoir beaucoup de mal lorsque j'ai découvert Waterline, l'ORM qui permet à Sails de communiquer avec la base de donnéees.

Je connais le principe d'un ORM grâce à Doctrine, qui est l'ORM utilisé par Symfony, que j'utilise donc au quotidien.

Mais là, il y a encore un souci : tout est asynchrone. TOUT.

Voilà un exemple bien rôdé de la syntaxe pour créer un utilisateur avec une entité nommée User (qui doit être créée manuellement, bien sûr) :

User.create({name:'Finn'}).exec(function (err, finn){
  if (err) { return res.serverError(err); }

  sails.log('Finn\'s id is:', finn.id);

  return res.ok();
});

Ici, il faut partir du principe que l'on est dans un Contrôleur (revoyez l'architecture MVC si besoin), et que ce contrôleur nous donne la possibilité d'avoir accès à la requête HTTP (variable req, non utilisée ici) et de préparer une réponse HTTP (variable res ici) qui nous sert à renvoyer une réponse "ok", en l'occurrence avec un code HTTP 200.

Mais dites-vous, que c'est asynchrone !

En effet, User.create().exec() est LA méthode pour créer une entité, et la fonction de callback de .exec() permet d'agir sur l'objet User une fois celui-ci créé. Ce qui veut dire que tant que res.ok() n'est pas exécuté... Il ne se passe rien ? Je ne sais pas, et je n'ai toujours pas compris, car chez moi le côté asynchrone a du mal à rentrer (et même que ça ne fonctionne pas, si si, des fois...).

Au final...


Et du coup, c'est là qu'a commencé l'appréhension : je découvre des nouveaux concepts, ceux-ci ne fonctionnent pas toujours, et en plus de ça, j'ai ce fichu blocage neurologique qui m'empêche d'avancer.

Première frustration liée à l'apprentissage d'une nouvelle technologie.

Et c'est pas fini...

(rendez-vous au prochain épisode ...)