La spécification ES2015 ou ES6 a introduit la class en JavaScript. Des bibliothèques telles que React sont passées de React.createClass à la class MyComponent extends React.Component, c’est-à-dire qu’ils sont passés de l’utilisation de leur propre constructeur à l’utilisation d’un langage intégré pour transmettre l’intention du programmeur.

Pour la couche de persistance d’une application Web Node.js, quelques bases de données me viennent à l’esprit, comme MongoDB (éventuellement associé à mongoose), ou une association de clés-valeurs comme Redis.

Pour exécuter une base de données relationnelle avec une application Node, Sequelize , “Un ORM de dialecte multi-SQL facile à utiliser pour Node.js” est une bonne option. Il permet à l’application de fonctionner avec une instance MySQL ou PostgreSQL et offre un moyen simple de mapper la représentation des entités dans la base de données vers JavaScript et inversement.

Les API v4 et inférieure de Sequelize pour les définitions de modèle se présentent comme suit:

1const MyModel = sequelize.define('MyModel', {
2  // fields and methods
3});

Pour ajouter des méthodes de classes et d’instance, vous devez écrire ce qui suit:

1// Class Method
2MyModel.associate = function (models) {};
3// Instance Method
4MyModel.prototype.someMethod = function () {..}

Cela est nécessaire avant l’ES6 car il n’existait pas de notion d’héritage classique. Maintenant, nous avons les classes, pourquoi ne pas les exploiter? Pour les développeurs habitués à avoir des classes, les éléments suivants vous sembleront probablement familiers:

1class MyModel extends Sequelize.Model {
2  static associate(models) {}
3  someMethod() {}
4}

Sequelize supporte réellement cela, mais la documentation manque un peu. L’un des seuls endroits où trouver une référence à la procédure à suivre est dans un numéro de GitHub: https://github.com/sequelize/sequelize/issues/6524.

Voici un aide-mémoire sur ce que vous souhaitez faire et comment le réaliser à l’aide de la classe ES6 + héritage de Sequelize.Model:

Initialiser le modèle avec le ou les champs saisis

 1const Sequelize = require('sequelize');
 2class MyModel extends Sequelize.Model {
 3  static init(sequelize, DataTypes) {
 4    return super.init(
 5      {
 6        myField: DataTypes.STRING,
 7      },
 8      { sequelize },
 9    );
10  }
11}

Associez votre modèle à d’autres modèles

1const Sequelize = require('sequelize');
2class MyModel extends Sequelize.Model {
3  static associate(models) {
4    this.myAssociation = this.belongsTo(models.OtherModel);
5    // or
6    this.myAssociation = models.MyModel.belongsTo(models.OtherModel);
7  }
8}

Définition d’un nom de table personnalisé pour votre modèle

 1const Sequelize = require('sequelize');
 2class MyModel extends Sequelize.Model {
 3  static init(sequelize, DataTypes) {
 4    return super.init(
 5      {
 6        // field definitions
 7      },
 8      {
 9        tableName: 'myModels',
10        sequelize,
11      },
12    );
13  }
14}

Définition d’un nom de modèle personnalisé pour votre modèle (pour Sequelize)

 1const Sequelize = require('sequelize');
 2class MyModel extends Sequelize.Model {
 3  static init(sequelize, DataTypes) {
 4    return super.init(
 5      {
 6        // field definitions
 7      },
 8      {
 9        modelName: 'myModel',
10        sequelize,
11      },
12    );
13  }
14}

Les requêtes

 1const Sequelize = require('sequelize');
 2class MyModel extends Sequelize.Model {
 3  static getId(where) {
 4    return this.findOne({
 5      where,
 6      attributes: ['id'],
 7      order: [['createdAt', 'DESC']],
 8    });
 9  }
10}

Méthodes d’instance

1const Sequelize = require('sequelize');
2class MyModel extends Sequelize.Model {
3  getFullName() {
4    return `${this.firstName} ${this.lastName}`;
5  }
6}

Initialisez tous vos modèles

require() suivi de model.init() est une alternative à sequelize.import(path), il est un peu plus clair ce qui est importé et non importé et sous quel nom.

 1const Sequelize = require('sequelize');
 2const sequelize = new Sequelize();
 3// pass your sequelize config here
 4const FirstModel = require('./first-model');
 5const SecondModel = require('./second-model');
 6const ThirdModel = require('./third-model');
 7const models = {
 8  First: FirstModel.init(sequelize, Sequelize),
 9  Second: SecondModel.init(sequelize, Sequelize),
10  Third: ThirdModel.init(sequelize, Sequelize),
11};
12// Run `.associate` if it exists,
13// ie create relationships in the ORM
14Object.values(models)
15  .filter(model => typeof model.associate === 'function')
16  .forEach(model => model.associate(models));
17const db = {
18  ...models,
19  sequelize,
20};
21module.exports = db;