Comment organiser un nœud application qui utilise sequelize?
Je suis à la recherche d'un exemple de nodejs application qui utilise le sequelize ORM.
Mon principal souci, c'est qu'il semble impossible de définir vos modèles de séparer les fichiers js si ces modèles ont des relations complexes à un autre en raison de require() la dépendance des boucles. Peut-être que les gens définissent tous leurs modèles dans un seul fichier, c'est très très long?
Je suis principalement intéressé par la façon dont les modèles sont définis et de les utiliser à travers l'application. Je voudrais avoir la validation de certains que ce que je fais sur mon propre est la "bonne" façon de faire les choses.
- J'ai ajouté un exemple qui peut aider quelqu'un github.com/shaishab/sequelize-express-example
- J'ai écrit un article à propos de notre solution: medium.com/@ismayilkhayredinov/...
Vous devez vous connecter pour publier un commentaire.
La courte histoire de
L'astuce dans ce cas est de ne pas initialiser le modèle dans le fichier mais simplement de fournir le nécessaire de l'information pour son initialisation et de laisser un module centralisé prendre soin des modèles d'installation et de l'instanciation.
Afin que les étapes sont les suivantes:
require
sur vos fichiers de modèle, de charger les modèles de la singleton à la place.La longue histoire
Voici une description plus détaillée de cette solution avec le code source correspondant:
http://jeydotc.github.io/blog/2012/10/30/EXPRESS-WITH-SEQUELIZE.html
EDIT: C'est un très vieux la réponse! (lire vers le bas pour info)
Qu'il est vieux et limitée à bien des égards!
Première, comme @jinglesthula mentionné dans les commentaires (et je l'ai vécu aussi) - il y a des problèmes exigeant de ces fichiers. C'est parce que
require
ne fonctionne pas de la même manière quereaddirSync
!Deuxième - vous très limitée dans les relations - le code ne fournit pas options à ces associations afin de vous INCAPABLE pour créer
belongsToMany
comme il se doitthrough
de la propriété. Vous pouvez faire la plupart de base assocs.Troisième - vous sont très limitées dans le modèle des relations! Si vous lisez attentivement le code, vous verrez que les relations est un Objet au lieu d'une Tableau, donc si vous voulez faire plus d'un associations du même type (comme d'avoir deux fois
belongsTo
) - vous ne pouvez pas!Quatrième - Vous n'avez pas besoin que singleton truc. Chaque module nodejs est un singleton par lui-même, donc tout cela est assez complexe pour aucune raison.
Vous devriez voir la Ferme de la réponse! (Le lien vers l'article est cassé, mais je vais le fixer avec cet échantillon officiel de sequelize: https://github.com/sequelize/express-example/blob/master/models/index.js - vous pouvez parcourir l'ensemble du projet pour avoir une idée de ce qui se passe).
p.s.
Je suis en train de modifier ce post car il est upvoted que les gens ne voient même pas toutes les nouvelles réponses (comme je l'ai fait).
Edit: Viens de modifier le lien vers une copie de la même post, mais dans une Page Github
require
d modules nœud étaient, en un sens, les singletons, car le code est exécuté une seule fois puis mis en cache, de sorte que la prochaine fois vous avez besoin d'eux, vous obtenez un objet mis en cache de référence. N'est-ce pas l'image en entier?SequelizeJS a un article sur leur site internet qui permet de résoudre ce problème.
Lien est brisé, mais vous pouvez trouver de l'échantillon de travail du projet ici et la parcourir. Voir édité réponse ci-dessus pour voir pourquoi c'est une meilleure solution.
Extrait de l'article:
models/index.js
L'idée de ce dossier est de configurer une connexion à la base de données et de recueillir toutes les définitions de Modèle. Une fois que tout est en place, nous allons appeler la méthode associée à chacun des Modèles. Cette méthode peut être utilisée pour associer le Modèle avec les autres.
sequelize
variable dans le fichier de votre modèle, vous pouvez accéder à votre autre modèle avecsequelize.models.modelName
.J'ai créer un package sequelize-se connecter pour aider les gens à composer avec ce problème. Il suit la Sequelize suggéré convention ici: http://sequelize.readthedocs.org/en/1.7.0/articles/express/
En outre, il a également des fonctions un peu plus comme la Mangouste en termes de son interface. Il vous permet de spécifier un ensemble de lieux où vos modèles sont situés et vous permet également de définir une correspondance personnalisée fonction pour correspondre à votre modèle fichiers.
L'utilisation est essentiellement comme ceci:
Ensuite, vous pouvez accéder aux modèles et sequelize comme suit:
J'espère que cela aide quelqu'un à sortir.
J'ai commencé à utiliser Sequelize dans Express.js app. Assez vite couru dans les questions de la nature que vous décrivez. Peut-être que je ne comprends pas très bien Sequelize, mais pour moi, faire les choses plus simplement en les sélectionnant à partir d'une table n'était pas vraiment pratique. Et où d'ordinaire vous utilisez sélectionnez l'une des deux tables ou plus, ou d'un syndicat en pur SQL, vous devez exécuter des requêtes distinctes, et avec la nature asynchrone de Nœud, il est juste d'ajouter de la complexité.
Donc j'ai déménagé loin de l'aide de Sequelize. De plus, je suis de commutation de l'utilisation de la récupération de données à partir de DB dans les modèles. À mon avis, il vaut mieux résumé l'obtention de données complètement. Et les raisons sont - imaginez que vous ne vous contentez pas d'utiliser MySQL (dans mon cas, j'utilise MySQL et MongoDB côté par côté), mais vous pouvez obtenir vos données de n'importe quel fournisseur de données et de tout mode de transport, par exemple, SQL, no-SQL, système de fichiers, l'API externe, FTP, SSH, etc. Si vous avez essayé de faire tout ça dans les modèles, vous serait éventuellement de créer complexes et difficiles à comprendre le code qu'il serait difficile de mettre à niveau et de débogage.
Maintenant ce que vous voulez faire est d'avoir des modèles d'obtenir des données à partir d'une couche qui sait où et comment l'obtenir, mais vos modèles uniquement utiliser les méthodes de l'API, par exemple
fetch
,save
,delete
etc. Et à l'intérieur de cette couche, vous avez des implémentations spécifiques pour les fournisseurs de données spécifiques. E. g. vous pouvez demander certaines données à partir d'un fichier PHP sur une machine locale ou à partir de Facebook ou API d'Amazon AWS ou de la télécommande du document HTML, etc.PS certaines de ces idées ont été empruntées à Architecte par Cloud9: http://events.yandex.ru/talks/300/
fetch
,save
,delete
etc. en dehors deSequelize
étant donné que le cadre déjà en fournit les moyens. Il est plus agréable, mais moins pratique d'avoir une extraction de la couche. Dans le même temps, vous pourriez probablement ajouter une extraction de la couche d'abstraction autour de Sequelize mais alors la solution est plus compliquée, pour défendable gagner.Je l'ai configuré comme Ferme et les documents décrivent.
Mais j'ai eu le bac d'alimentation supplémentaire de problème que dans mes méthodes d'instance et les méthodes de la classe que je voudrais joindre les modèles dans chaque fonction, j'aurais besoin d'exiger le fichier d'index pour obtenir une prise d'autres objets de base de données.
Résolu en les rendant accessibles à tous les modèles.
Et dans le fichier de modèle
J'ai seulement fait cela pour les méthodes de classe, mais vous pouvez également faire la même chose pour les méthodes d'instance.
Je suis le guide officiel: http://sequelizejs.com/heroku, qui a un dossier de modèles, de chaque module dans des fichiers séparés, et ont un indice de fichier à importer et d'établir la relation entre eux.
Exemple de modèle sequelize
JS:
Vous pouvez importer des modèles à partir d'autres fichiers avec
sequelize.import
http://sequelizejs.com/documentation#models-import
De cette façon vous pouvez avoir un singleton module pour sequelize, qui charge ensuite tous les autres modèles.
En fait, cette réponse est tout à fait semblable à user1778770 de réponse.
Vous pourriez être intéressé à regarder le PEAN.JS passe-partout de solution.
La PEAN projet est un fork de la MEAN.JS projet (à ne pas confondre avec la MOYENNE.IO ou la générique MOYENNE de la pile).
PEAN remplace MongoDB et la Mangouste ORM avec PostgreSQL et Sequelize. Un des principaux avantages de l'MEAN.JS projet est l'organisation elle offre à une pile qui a beaucoup de pièces mobiles.
Vous pouvez également utiliser une injection de dépendance qui fournit une solution élégante à ce. Voici un https://github.com/justmoon/reduct