J'ai commencé à utiliser Sequelize dans une application Express.js. Assez rapidement, j'ai rencontré des problèmes de la nature de ceux que vous décrivez. Peut-être que je n'ai pas bien compris Sequelize, mais pour moi, faire des choses plus que simplement sélectionner dans une table n'était pas vraiment pratique. Et là où normalement vous utiliseriez select from two or more tables, ou une union en SQL pur, vous auriez à exécuter des requêtes séparées, et avec la nature async de Node c'est juste une complexité supplémentaire.
J'ai donc cessé d'utiliser Sequelize. De plus, j'ai renoncé à utiliser TOUTES les données extraites de la base de données dans les modèles. À mon avis, il est préférable d'abstraire complètement la récupération des données. Et les raisons sont les suivantes : imaginez que vous n'utilisez pas seulement MySQL (dans mon cas, j'utilise MySQL et MongoDB côte à côte), mais que vous pouvez obtenir vos données à partir de n'importe quel fournisseur de données et de n'importe quelle méthode de transport, par exemple SQL, no-SQL, système de fichiers, API externe, FTP, SSH, etc. Si vous essayez de faire tout cela dans les modèles, vous finirez par créer un code complexe et difficile à comprendre qui sera difficile à mettre à jour et à déboguer.
Maintenant, ce que vous voulez faire, c'est que les modèles obtiennent des données à partir d'une couche qui sait où et comment les obtenir, mais vos modèles n'utilisent que des méthodes API, par ex. fetch
, save
, delete
etc. Et à l'intérieur de cette couche, vous avez des implémentations spécifiques pour des fournisseurs de données spécifiques. Par exemple, vous pouvez demander certaines données à partir d'un fichier PHP sur une machine locale, de l'API de Facebook, d'Amazon AWS ou d'un document HTML distant, etc.
PS certaines de ces idées ont été empruntées à Architecte par Cloud9 : http://events.yandex.ru/talks/300/
3 votes
J'ai ajouté un exemple qui pourrait aider quelqu'un github.com/shaishab/sequelize-express-example
0 votes
J'ai écrit un article sur notre solution : medium.com/@ismayilkhayredinov/