Archives du mot-clé javascript

Écrire un service REST avec NodeJS et Express – partie 2/3: jouons avec les middlewares

Dans la première partie, nous avions écrit (en mode TDD un peu raccourci) un service REST. On est quand-même allés au bout, mais ça restait améliorable.

Dans cette seconde partie nous allons jouer avec les middlewares Express pour factoriser, ajouter diverses vérifications sur les données, etc… Afin de ne pas imposer de pavés trop lourd, je garderai finalement pour un 3e article l’intégration du support de nouveaux formats, et l’écriture d’une doc agréable à utiliser.

Sommaire

Lire la suite

Benchmark Node.JS: méthodes synchrones ou asynchrones ?

On dit souvent que les méthodes asynchrones apportent à Node.JS un avantage dans sa gestion des accès concurrents. On dit que pour une opération aussi coûteuse que de la lecture sur le disque par exemple, il saura gérer plus de connexions, et dans l’ensemble répondre plus vite si cette opération est faite en utilisant l’API asynchrone plutôt que l’API synchrone.

OK. Soit. En ce qui me concerne je n’ai pas le niveau technique pour comprendre les tenants et les aboutissants de tout ça, donc comment m’en convaincre? Et bien, benchmarkons :)

Partons d’un serveur HTTP très simple: il n’a qu’une page, qui affiche « coucou gamin » dès que le serveur a fini de lire un fichier local de quelques méga-octets.

Dans la suite de l’article je vais vous proposer 3 implémentations de ce serveur, et les résultats d’un test par Apache Bench.

Lire la suite

Le point sur Javascript et l’héritage prototypal

Javascript n’est pas à proprement parler un langage objet, mais il dispose quand-même d’un opérateur new et de trucs qui ressemblent vachement à des propriétés et des méthodes. Donc par raccourci, on parle d’objet.

Dans les différents tutoriels sur le sujet, quand on aborde l’héritage, la méthode proposée est souvent celle-là:

1
2
3
4
5
6
7
8
9
10
function Animal(nom) { // class Animal
  this.nom = nom;
}
Animal.prototype.manger = function() { // Animal.manger()
  console.log('Miam!');
}
function Chien(nom) { // class Chien extends Animal
  Animal.call(this, nom); // super(nom)
}
Chien.prototype = new Animal(); // le fameux extends est là

Cette méthode n’est pas parfaite puisque pour implémenter l’héritage on va instancier un objet de la classe parente. WTF ? Du coup, faisons un petit tour des méthodes alternatives.

Lire la suite

Node.JS: l’avènement de la programmation asynchrone ?

On est plutôt habitué dans nos développements à faire du synchrone: on appelle une fonction, elle retourne une valeur quand elle a fini de travailler. Avec Javascript ça peut être totalement différent, par exemple avec Node.JS:

var fs = require("fs");
fs.readFile("fichier.txt", function(err, content) {
  if (err) {
    console.err(err);
  } else {
    console.log("file read: " + content.length + " bytes");
  }
}
console.log("after readFile");

En programmation synchrone, ce bout de code aurait lu le fichier, affiché « file read: X bytes » puis « after readFile ». Avec Node.JS ce n’est pas le cas, car toutes les fonctions systèmes ont une version synchrone (qui renvoie un résultat et lève une exception en cas d’erreur), et une vesion asynchrone (qui ne va rien renvoyer, rendre tout de suite la main, et prendre en paramètre un callback acceptant une éventuelle exception et le reste des paramètres). Lire la suite

Un bug bien classique qui permet de parler de JS et du scope

J’ai pu débugger récemment ce bout de code:

1
2
3
4
5
6
// on a n boutons, cliquer sur le bouton "i" a pour effet de cacher un lien correspondant
for (var i=0; i<nbCheckboxes; i++) {
  $('input[name="val' + i + '"]').click(function() {
    $('#link'+i).hide();
  });
}

Etrangement, quelque soit le bouton cliqué, rien ne se passait… Après vérification, à chaque clic jQuery essayait de me cacher le lien « #link5 » (sachant que j’avais 5 liens, numérotés de 0 à 4, ça pouvait moyennement marcher).

Mine de rien, ce petit bug peut arriver. Rarement, parce qu’on a rarement un code aussi mal foutu hein :) mais ça peut arriver. Et ce petit bug de rien du tout relève d’une feature mal comprise de Javascript que j’appelle les « contextes dynamiques », mais qui relève simplement de la portée des variables. Lire la suite