Ich suche nach einer Beispiel-NodeJS-App, die das Sequelize-ORM verwendet.
Mein Hauptanliegen ist, dass es nahezu unmöglich erscheint, Ihre Modelle in separaten js-Dateien zu definieren, wenn diese Modelle aufgrund von require () - Abhängigkeitsschleifen komplexe Beziehungen zueinander haben. Vielleicht definieren die Leute alle ihre Modelle in einer Datei, die sehr, sehr lang ist?
Ich interessiere mich hauptsächlich dafür, wie die Modelle in der gesamten App definiert und verwendet werden. Ich hätte gerne eine Bestätigung, dass das, was ich alleine mache, die "gute" Art ist, Dinge zu tun.
node.js
express
sequelize.js
mkoryak
quelle
quelle
Antworten:
Die Kurzgeschichte
Der Trick in diesem Fall besteht nicht darin, das Modell in zu initialisieren der Datei sondern lediglich die für die Initialisierung erforderlichen Informationen bereitzustellen und ein zentrales Modul die Einrichtung und Instanziierung des Modells übernehmen zu lassen.
Die Schritte sind also:
require
auf dem Modelldatei, laden Sie die Modelle aus dem Singleton statt.Die längere Geschichte
Hier ist eine detailliertere Beschreibung dieser Lösung mit dem entsprechenden Quellcode:
http://jeydotc.github.io/blog/2012/10/30/EXPRESS-WITH-SEQUELIZE.html
EDIT: Dies ist eine sehr alte Antwort! (Informationen lesen)
Es ist alt und in vielerlei Hinsicht begrenzt!
Erstens , wie @jinglesthula in den Kommentaren erwähnt hat (und ich habe es auch erlebt), gibt es Probleme, diese Dateien zu benötigen. Es ist, weil
require
es nicht so funktioniert wiereaddirSync
!Zweitens - Ihre Beziehungen sind sehr eingeschränkt - bietet der Code diesen Zuordnungen keine Optionen , sodass Sie nicht erstellen können,
belongsToMany
wenn erthrough
Eigenschaften benötigt . Sie können die grundlegendsten Assocs machen.Drittens - Sie sind in Modellbeziehungen sehr eingeschränkt! Wenn Sie den Code genau lesen, werden Sie feststellen, dass Relationen ein Objekt anstelle eines Arrays sind. Wenn Sie also mehr als eine Zuordnung desselben Typs herstellen möchten (z. B. zweimal
belongsTo
), können Sie dies nicht!Viertens - Sie brauchen dieses Singleton-Ding nicht. Jedes Modul in nodejs ist für sich genommen Singleton, daher ist alles ohne Grund ziemlich komplex.
Sie sollten Farms Antwort sehen! (Der Link zum Artikel ist defekt, aber ich werde ihn mit diesem offiziellen Beispiel von sequelize beheben: https://github.com/sequelize/express-example/blob/master/models/index.js - Sie können das durchsuchen ganzes Projekt, um eine Vorstellung davon zu bekommen, was los ist).
ps Ich bearbeite diesen Beitrag, da er so positiv bewertet ist, dass die Leute nicht einmal neue Antworten sehen (wie ich).
Bearbeiten: Ich habe gerade den Link zu einer Kopie desselben Beitrags geändert, jedoch auf einer Github-Seite
quelle
require
d-Module im Knoten in gewisser Weise Singletons waren, da der darin enthaltene Code einmal ausgeführt und dann zwischengespeichert wird, sodass Sie beim nächsten Mal eine zwischengespeicherte Objektreferenz erhalten. Ist das nicht das ganze Bild?SequelizeJS hat einen Artikel auf seiner Website, der dieses Problem löst.
Der Link ist defekt, aber Sie können das funktionierende Beispielprojekt hier finden und es durchsuchen. In der bearbeiteten Antwort oben erfahren Sie, warum dies eine bessere Lösung ist.
Auszug aus dem Artikel:
models / index.js
Die Idee dieser Datei ist es, eine Verbindung zur Datenbank zu konfigurieren und alle Modelldefinitionen zu sammeln. Sobald alles vorhanden ist, rufen wir die Methode auf, die jedem der Modelle zugeordnet ist. Diese Methode kann verwendet werden, um das Modell anderen zuzuordnen.
quelle
sequelize
Variable in Ihrer Modelldatei haben, können Sie mit auf Ihr anderes Modell zugreifensequelize.models.modelName
.Ich habe ein Paket erstellt sequelize-connect erstellt , um Menschen bei der Bewältigung dieses Problems zu helfen. Es folgt der von Sequelize vorgeschlagenen Konvention hier:http://sequelize.readthedocs.org/en/1.7.0/articles/express/
Außerdem funktioniert es in Bezug auf die Benutzeroberfläche ein bisschen mehr wie Mongoose. Sie können eine Reihe von Speicherorten angeben, an denen sich Ihre Modelle befinden, und eine benutzerdefinierte Übereinstimmungsfunktion definieren, die Ihren Modelldateien entspricht.
Die Verwendung ist im Grunde wie folgt:
Dann können Sie auf die Modelle zugreifen und wie folgt fortfahren:
Hoffentlich hilft das jemandem.
quelle
Ich habe angefangen, Sequelize in der Express.js-App zu verwenden. Schon bald stießen wir auf Probleme der Art, die Sie beschreiben. Vielleicht habe ich Sequelize nicht ganz verstanden, aber für mich war es nicht wirklich praktisch, Dinge zu tun, die mehr als nur aus einer Tabelle auszuwählen. Und wo Sie normalerweise die Auswahl aus zwei oder mehr Tabellen oder eine Vereinigung in reinem SQL verwenden würden, müssten Sie separate Abfragen ausführen, und mit der asynchronen Natur von Node wird nur die Komplexität erhöht.
Deshalb habe ich mich von Sequelize verabschiedet. Außerdem wechsle ich von der Verwendung von JEDEM Datenabruf aus der Datenbank in den Modellen. Meiner Meinung nach ist es besser, Daten vollständig zu abstrahieren. Und Gründe sind - stellen Sie sich vor, Sie verwenden nicht nur MySQL (in meinem Fall MySQL und MongoDB nebeneinander), sondern Sie können Ihre Daten von jedem Datenanbieter und jeder Transportmethode abrufen, z. B. SQL, No-SQL, Dateisystem, externe API, FTP, SSH usw. Wenn Sie versuchen würden, alles in den Modellen zu tun, würden Sie schließlich komplexen und schwer verständlichen Code erstellen, der schwer zu aktualisieren und zu debuggen wäre.
Nun , was Sie tun möchten , ist es, Modelle von Daten aus einer Schicht erhalten haben, der weiß , wo und wie sie es zu bekommen, aber Ihre Modelle nur API - Methoden verwenden, zB
fetch
,save
,delete
usw. Und innerhalb dieser Schicht haben Sie spezifische Implementierungen für bestimmte Datenanbieter. Sie können beispielsweise bestimmte Daten von einer PHP-Datei auf einem lokalen Computer oder von der Facebook-API oder von Amazon AWS oder von einem entfernten HTML-Dokument usw. anfordern.PS: Einige dieser Ideen wurden von Cloud9 von Architect übernommen : http://events.yandex.ru/talks/300/
quelle
fetch
,save
,delete
usw. außerhalbSequelize
gegeben , dass der Rahmen bereits die Mittel zur Verfügung stellt. Es ist schöner, aber weniger bequem, eine separate Abrufschicht zu haben. Gleichzeitig könnten Sie wahrscheinlich eine Abstraktionsebene zum Abrufen von Sequelize hinzufügen, aber dann ist die Lösung komplizierter, um einen streitbaren Gewinn zu erzielen.Ich habe es als Farm eingerichtet und die Dokumentation beschreibt.
Ich hatte jedoch das zusätzliche Problem, dass ich in meinen Instanzmethoden und Klassenmethoden, die ich an die Modelle in jeder Funktion anhängen würde, die Indexdatei benötigen würde, um andere Datenbankobjekte zu erhalten.
Es wurde gelöst, indem sie allen Modellen zugänglich gemacht wurden.
Und in der Modelldatei
Ich habe dies nur für die Klassenmethoden getan, aber Sie können das Gleiche auch für Methoden tun.
quelle
Ich folge dem offiziellen Handbuch: http://sequelizejs.com/heroku , das einen Modellordner hat, richte jedes Modul in separaten Dateien ein und habe eine Indexdatei, um sie zu importieren und die Beziehung zwischen ihnen festzulegen.
quelle
Beispielmodell sequelize
quelle
Sie können Modelle aus anderen Dateien mit http://sequelizejs.com/documentation#models-import importieren
sequelize.import
Auf diese Weise können Sie ein Singleton-Modul für die Fortsetzung haben, das dann alle anderen Modelle lädt.
Eigentlich ist diese Antwort der Antwort von user1778770 ziemlich ähnlich.
quelle
Vielleicht interessieren Sie sich für die PEAN.JS Boilerplate-Lösung.
Das PEAN-Projekt ist eine Abzweigung des MEAN.JS-Projekts (nicht zu verwechseln mit MEAN.IO oder dem generischen MEAN-Stack).
PEAN ersetzt MongoDB und das Mongoose ORM durch PostgreSQL und Sequelize. Ein Hauptvorteil des MEAN.JS-Projekts ist die Organisation eines Stapels mit vielen beweglichen Teilen.
quelle
Sie können auch eine Abhängigkeitsinjektion verwenden, die eine elegante Lösung dafür bietet. Hier ist eine https://github.com/justmoon/reduct
quelle