Créer une librairie node.js

node_js2

 

L’objet de cet article va être de s’inspirer du code javascript de l’article Accès mysql avec node.js, pour créer une librairie d’accès aux données par le biais d’un namespace javascript…..


 

Prérequis

- Avoir un serveur mysql installé;
- savoir ce qu’est node.js (voir l’article Comprendre node.js
- avoir installé node.js (voir l’article Installer node.js sous Windows);
- avoir lu l’article Accès mysql avec node.js;
- avoir lu l’article Les namespace javascript.

 

Le code existant

Le code suivant exécute une requête SQL (SELECT * FROM test) à l’aide de la librairie mysql et en affiche le résultat dans la console javascript.

L’exemple ci-dessous utilise la librairie mysql de manière brutale :
- il crée un objet mysql;
- puis crée une connexion qui renvoie un objet à partir duquel les requêtes sql sont exécutées.

var mysql = require('mysql');
 
var mySqlClient = mysql.createConnection({
  host     : "localhost",
  user     : "user",
  password : "password",
  database : "mysqlTest"
});
 
var selectQuery = 'SELECT * FROM test';
 
mySqlClient.query(
  selectQuery,
  function select(error, results, fields) {
    if (error) {
      console.log(error);
      mySqlClient.end();
      return;
    }
 
    if ( results.length > 0 )  { 
      var firstResult = results[ 0 ];
      console.log('id: ' + firstResult['id']);
      console.log('label: ' + firstResult['label']);
      console.log('valeur: ' + firstResult['valeur']);
    } else {
      console.log("Pas de données");
    }
    mySqlClient.end();
  }
);

 

Réorganisation du code existant au sein d’un namespace javascript

La première chose à faire est d’intégrer le code existant dans un namespace en utilisant la notation json.

Ce namespace comporte :
- 2 attributs : mysql dédié à l’instanciation d’un objet node.js de la librairie mysql et mySqlClient objet dédié à la connexion à la base de données;
- une méthode connect prenant en paramètres le données de connexion (hôte, utilisateur, mot de passe et base de données);
- une méthode close de fermeture de connexion à la base de données;
- une méthode executeSelectQuery exécutant une requête sql select donnée en paramètre et qui en retourne le résultat sous forme d’un tableau.

Le code modifié :

db = {
  mysql : require('mysql'),
  mySqlClient : null,
 
  connect : function (host, user, password, database) {
    this.mysql = require('mysql');
    this.mySqlClient = this.mysql.createConnection({
      host     : host,
      user     : user,
      password : password,
      database : database
    });  
  },
 
  close : function() {
    this.mySqlClient.end();
  },
 
  executeSelectQuery : function( selectQuery, callbackResultFunction ) {
    this.mySqlClient.query(
    selectQuery,
    function select(error, results, fields) {
      if (error) {
        console.log(error);
        this.mySqlClient.end();
        return;
      }
 
      if ( results.length > 0 )  { 
        callbackResultFunction(results);
      } else {
        console.log("Pas de données");
      }
      this.mySqlClient.end();
    });
  }
};

 

Transformer le code produit en librairie node.js

L’utilisation d’un simple mot clé transformera le namespace javascript en librairie : module.exports.

Le code change donc très peu et devient :

db = module.exports = {
  mysql : require('mysql'),
  mySqlClient : null,
 
  connect : function (host, user, password, database) {
    this.mysql = require('mysql');
    this.mySqlClient = this.mysql.createConnection({
      host     : host,
      user     : user,
      password : password,
      database : database
    });  
  },
 
  close : function() {
    this.mySqlClient.end();
  },
 
  executeSelectQuery : function( selectQuery, callbackResultFunction ) {
    this.mySqlClient.query(
    selectQuery,
    function select(error, results, fields) {
      if (error) {
        console.log(error);
        this.mySqlClient.end();
        return;
      }
 
      if ( results.length > 0 )  { 
        callbackResultFunction(results);
      } else {
        console.log("Pas de données");
      }
      this.mySqlClient.end();
    });
  }
 
};

 

Utiliser la librairie node.js

La librairie que vous créez s’utilise à l’identique qu’une librairie node.js : par le biais du mot clé require en prenant en paramètre le chemin complet vers le fichier de votre librairie nouvellement créée.

Pour l’exemple, imaginez que vous ayez une base de données nommée mysqlTest encapsulant une table test avec deux champs myField1 et myField2.

Le traitement des données se fait par le biais d’une fonction nommée processResult passée en paramètre de la méthode executeSelectQuery.

var db = require('db.js');
 
var processResult : function(row) {
  console.log('field1: ' + row.myField1);
  console.log('field2: ' + row.myField2);
}
 
db.connect("localhost", "user", "password", "mysqlTest");
db.executeSelectQuery("select * from test",processResult);

La fonction processResult est appelée autant de fois qu’il y a de lignes à traiter..

 

Remarques

Créer une librairie qui ferait la même chose que la librairie mysql n’aurait aucun sens : la librairie mysql fait très bien son travail.

L’intérêt ici est de spécialiser le code pour répondre à votre besoin en créant une librairie qui lui est dédiée. Pour faire une analogie, on pourrait comparer cette librairie à un DAO (Database Access Object).

Par exemple, un DAO permettant de sauvegarder des données relatives aux joueurs d’un jeu vidéo.

 

Des remarques, des améliorations, des idées, des coquilles : faites le savoir. Faites savoir si cet article vous a été utile par le biais d’un commentaire ou des réseaux sociaux.

 

2 commentaires pour Créer une librairie node.js

  • Foucart  dit:

    Très bon tuto remplacer la dernier ligne }); par

    )}
    };

    cependant dans le return results; de executeSelectQuery il ne renvoie rien.
    Dans le cas ou je fais un console.log(results) juste avant le return là il y a bien le resultat peut être une idée.

    Merci encore

    • Franck Dubois  dit:

      Merci pour ta remarque, c’est corrigé.
      J’ai modifié l’article pour mieux répondre à ta problématique.
      Ton problème était lié au mode asynchone de node.js et aussi à la portée des variables.

Laisser une réponse

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>