expressjs —Connexion à une base de données avec sequelize et ses extensions (sequelize-cli, sequelize-auto…)


img

Cet article est la suite d’un premier article sur la création d’une application web en nodejs grâce au package express-generator. Cette fois ci, notre objectif est d’ajouter une connexion MySQL pour pouvoir récupérer les informations depuis une base de données et afficher ces informations dans l’application sous forme de liste simple.

On utilisera MySQL comme base de données . Pour cela, nous allons nous servir d’un ORM (Object Relational Mapping). Il existe plusieurs ORM nodejs tels que : sequelize, typeORM et mongoose. L’ORM le plus adapté dans notre cas est sequelize. Sequelize permet l’utilisation d’une base de données de type : MySQL, Postgres, SQLite et Microsoft SQL Server.

On ajoutera également d‘autres packages nodejs utiles telles que : sequelize-auto, sequelize-cli (qui sont des extensions de sequelize) , mysql2 et mysql.

  • mysql et mysql2 sont 2 librairies obligatoires pour être utilisé avec sequelize et sequelize-auto. sequelize a besoin de mysql2 pour fonctionner correctement et sequelize-auto a lui besoin de mysql .

On installe ces packages en tapant ceci dans une console.

npm install sequelize sequelize-auto sequelize-cli mysql mysql2 --save

Comme sequelize-cli et sequelize-auto seront installées dans le même dossier de l’application, on utilisera npx : ( un utilitaire qui permet d’exécuter des binaires à partir de paquets npm).

Exécutons

npx sequelize-cli init

Cette commande crée 4 dossiers:

  • models
  • le fichier models/index.js
  • config
  • le fichier config/config.json
  • migrations
  • seeders

On modifie le fichier config/config.json et on remplit par les informations de notre BDD

{
  "development": {
    "username": "root",
    "password": "*****",
    "database": "dbname",
    "host": "localhost",
    "dialect": "mysql",
    "operatorsAliases": false
  },
  "test": {
    "username": "root",
    "password": "*****",
    "database": "dbname_dev",
    "host": "localhost",
    "dialect": "mysql",
    "operatorsAliases": false
  },
  "production": {
    "username": "root",
    "password": "*****",
    "database": "dbname_prod",
    "host": "localhost",
    "dialect": "mysql",
    "operatorsAliases": false
  }
}

Dans notre exemple, sequelize utilisera les informations de connexion contenues dans “developpement”. On peut savoir cela grâce à la ligne suivante dans le fichier models/index.js

const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];

Utilisons la commande suivante pour créer un nouveau model.

npx sequelize-cli model:generate - name User - attributes firstName:string,lastName:string,email:string

Comme précisé plus haut, grâce au package sequelize-auto, on pourra générer automatiquement nos models à partir de tables existantes, ce qui est notre cas, car on a déjà une base de données prête.

npx sequelize-auto -o "./models" -d dbname -h localhost -u root -p 3306 -x motdepasse -e mysql

Récupération des données

On modifie le fichier bin/www . On ajoute

var models = require('../models');

Puis

models.sequelize.sync().then(function() {
    /**
     * Listen on provided port, on all network interfaces.
     */
    server.listen(port, function() {
        debug('Express server listening on port ' + server.address().port);
    });
    server.on('error', onError);
    server.on('listening', onListening);
});

pour synchroniser automatiquement les models à la base de données.

Afficher les infos dans routes/users.js

On va modifier le fichier routes/users.js et ajouter

const db = require('../models');

Puis dans le bloc

router.get('/', function(req, res, next) {
    db.api.findAll({ limit: 10 }).then(function(rows) {
       res.render('user', { rows: rows });
   });
});

Dans l’exemple ci-dessus — api est le nom du model models/api.js qui ressemble à ceci

module.exports = function(sequelize, DataTypes) {
  return sequelize.define('api', {
    id: {
      type: DataTypes.INTEGER(11),
      allowNull: false,
      primaryKey: true,
      autoIncrement: true
    },
    name: {
      type: DataTypes.STRING(255),
      allowNull: false
    },
    created_at: {
      type: DataTypes.DATE,
      allowNull: true
    },
    updated_at: {
      type: DataTypes.DATE,
      allowNull: true
    }
  }, {
    tableName: 'api',
    underscored: true
  });
};

Voici un aperçu de la table api

img

Template handlebars

Aussi modifions views/user.hbs comme ceci

{{#each rows}}
    <div class="border-bottom__1px_solid_black">
        <h2>{{name}}</h2>
        {{{created_at}}}
    </div>
{{/each}}

qui affiche simplement une boucle “#each” : name et created_at sont des champs dans la table api.

On va ensuite sur l’url http://localhost:3000/users et on devrait avoir ceci comme résultats

img

Sources: https://github.com/rabehasy/nodejs-express/tree/step1

Ce post est également publié sur Medium