Tilap.net

Développement web

NodeJS

Yarn en remplacement de npm

Actuellement, Npm est le gestionnaire de paquet le plus populaire dans l’écosystème Javascript. Facebook a publié un nouveau gestionnaire, Yarn. Ce dernier apporte quelques fonctionnalités qui deviennent vite indispensables.

Installation offline

A l’installation d’un paquet, Yarn conserve une copie du paquet original. Il est alors possible de réinstaller ce même paquet, dans la même version, en étant offline.

NPM, local, tarball…

Yarn profite de npm et permet d’en installer n’importe quel paquet. Par exemple

yarn add koa 

Lire la suite »

NodeJS: Trouver les promises non résolues

L’avènement des promises en JS a grandement améliorer lisibilité, interopérabilité et simplicité du code. Néanmoins, à l’utilisation, on se heurte rapidement au problème des promises non résolues et non gérées, qui bloquent le programme.

Avec le code suivant, si doSomething() est rejetée, votre code sera silencieux car à aucun moment vous ne catchez l’erreur. Et pour trouver pourquoi votre code plante, il vous faudra chercher à l’aveugle dans votre code.

doSomething().then((res) => doSomethingElse(res));

Pour éviter cette situation et trouver les promises rejetées que vous auriez oublié de gérer, vous pouvez utiliser l’évènement unhandledRejection de process qui prendra le relai.

process.on('unhandledRejection', (reason) => console.error(`Unhandle promise rejection: ${reason}`));

Tout code qui suivra (et dont une promise rejetée ne sera pas gérée) sera remonté dans votre console. Utile en debug ou dans les cas de crashs incontrollable, ça ne doit par contre pas devenir une solution de logique dans votre application.

ES6: surcharge des classes: propriétés et méthodes statiques

Avec l’avènement de l’ES6, la POO est bien plus évidente qu’auparavant. Et j’en arrive à vouloir utiliser des pattern usuels transposés d’autres langage, comme dans cet exemple où je souhaite ajouter méthodes et propriétés à une classe de façon « dynamique », c’est à dire à postériori et dont les noms vont être définis de façon dynamique.

Lire la suite »

KoaJS – Middleware pour des urls propres

Voici mon premier middleware KoaJS disponible publiquement sur npm: il nettoie les URL en entrées, et au besoin redirige vers les Urls propres.

Pourquoi est-ce important d’avoir des URLS propres ?

Avoir des urls mal formatées avec des caractères illisibles, des slash en double ou plus, des majuscules, des minuscules… est néfaste à plusieurs niveaux. Au delà du simple désagrément visuel, mal formatées, plusieurs urls vous mènent à une même page de contenu.

Exemple:
http://tilap.net/article et http://tilap.net/ArtiCLE mèneront à la même page
http://tilap.net/mon/article et http://tilap.net/mon///article/

Le problème ? D’une part pour votre référencement: une même page avec plusieurs urls, ça s’appelle du duplicate content, et ça vous flingue dans le classement de Google.

D’autre part, lorsque vous partagez une URL sur un compte social (twitter, facebook, …), le décompte de ces urls et de leurs partage se base sur un hash de l’url. Et donc, vous ne pouvez pas suivre correctement vos partages…

Lire la suite »

Slack: Poster des twitts avec un bot depuis un chan

Slack est un parfait lieu d’échange, que ce soit en entreprise (comme dans ma boite Evaneos) ou pour des communautés autonomes (comme celle de Scotch.io ou Frontend FR par exemple).

Tout comme sur les autres réseaux sociaux, on y partage beaucoup de liens, et on a souvent envie de les repartager sur le/les comptes Twitter de la communauté/entreprise. Par exemple, chez Evaneos, on pense à alimenter des comptes twitter de veille aussi bien UX que dev.

Et ainsi naquit le bot

La solution pour éviter de partager les accès à tout le monde et de le faire depuis Slack directement: un petit robot Hubot que vous pouvez vous aussi utiliser.

Lire la suite »

Trouver les packages inutiles dans votre code Node avec Gulp et depcheck

Lorsqu’un projet NodeJS devient un peu conséquent, la liste des dépendances a souvent tendance à s’allonger. Au fil du temps, certains packages ne sont plus utilisés mais ne sont pas toujours supprimés du package.json.

Voici donc une tache gulp très simple, basée sur depcheck, qui vous avertira si des paquets sont inutilisés.

Lire la suite »

NodeJS en production

Je développe habituellement en PHP mais me suis mis récemment à NodeJS. Et j’ai découvert que la mise en production d’application nodeJS est un peu plus complexe. Mais soyons honnête, là où j’appréhender des difficultés, il s’avère que ça reste très simple.

NodeJS en production : faire persister le process node avec PM2

En phase de développement, lancer une application node consiste simplement à ouvrir un terminal et à lancer une commande de ce style:

node app.js

ou bien pour avoir des reload automatique, avec nodemon

./node_modules/.bin/nodemon server.js

Mais dès que l’on ferme le terminal, l’application s’arrête. La solution de le lancer dans un screen est une première solution, mais au reboot du serveur ou si pour une raison quelconque screen meurt, l’application nodejs s’arrête.

Pour assurer la survie de mon application, j’utilise donc le package PM2 qui va veiller à maintenir mon application en vie et à la relancer au reboot de mon serveur. Pour l’installer, rien de plus simple:

npm install pm2 -g

PM2: utilisation

  • Lancer une application avec PM2:
    pm2 start app.js

  • Arréter une application avec PM2:

    pm2 stop app.js

  • Relancer une application avec PM2:

    pm2 restart app.js

  • Lister toutes les applis qui tournent avec PM2:

    pm2 list app.js

En aspect pratique, la liste des appli gérée par pm2, leur status et les quelques infos indispensables sont bien clairement présentées dans la console.

pm2-start
pm2-start

Rendre l’application disponible sur votre port 80 avec un reverse proxy Apache

L’application tourne à présent, mais est disponible sur le port que vous aurez configuré (du style http://domain.tld:3001). Pour la rendre disponible via Apache, nous allons faire un reverse proxy: tout ce qui arrivera sur un virtualhost donné avec le port 80 sera redirigé vers l’application node.

Activer les modules apache

On va avoir besoin des modules proxy et proxy_http. Ils sont disponibles avec Apache, mais ne sont pas activés par défaut. Donc au besoin:

a2enmod http
a2enmod http_proxy

Déclarer le virtualhost et le reverse proxy

<VirtualHost *:80>
ServerName my-domain.tld
DocumentRoot "/path/to/node/application"
<Directory "/path/to/node/application">
AllowOverride All
Allow from All
</Directory>
ProxyRequests off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
<Location />
ProxyPass http://localhost:3001/
ProxyPassReverse http://localhost:3001/
</Location>
</VirtualHost>

Autres pistes

Il existe des alternatives à pm2 comme forever lui aussi très utilisé et pas plus compliqué que pm2.

J’ai décrit la démarche avec Apache pour des raisons pragmatiques (je le connais bien et c’est ce que j’ai sur la majorité de mes serveurs), mais la même chose est réalisable avec nginx et est à priori plus performant.

X