Szukam przykładowej aplikacji nodejs, która wykorzystuje sekwencjonowanie ORM.
Moim głównym zmartwieniem jest to, że wydaje się niemożliwe zdefiniowanie modeli w oddzielnych plikach js, jeśli modele te mają złożone relacje między sobą z powodu pętli zależności require (). Może ludzie definiują wszystkie swoje modele w jednym bardzo długim pliku?
Interesuje mnie głównie to, jak modele są definiowane i używane w aplikacji. Chciałbym uzyskać potwierdzenie, że to, co robię sam, jest „dobrym” sposobem robienia rzeczy.
node.js
express
sequelize.js
mkoryak
źródło
źródło
Odpowiedzi:
Krótka historia
Sztuczka w tym przypadku nie polega na zainicjowaniu modelu w pliku, ale po prostu na dostarczeniu niezbędnych informacji do jego inicjalizacji i pozwoleniu scentralizowanemu modułowi zająć się konfiguracją i instancją modeli.
Oto kroki:
require
w plikach modelu, zamiast tego załaduj modele z singletona.Dłuższa historia
Oto bardziej szczegółowy opis tego rozwiązania wraz z odpowiednim kodem źródłowym:
http://jeydotc.github.io/blog/2012/10/30/EXPRESS-WITH-SEQUELIZE.html
EDYCJA: To bardzo stara odpowiedź! (przeczytaj informacje)
Jest stary i ograniczony na wiele sposobów!
Po pierwsze , jak @jinglesthula wspomniał w komentarzach (i ja też tego doświadczyłem) - są problemy z wymaganiem tych plików. To dlatego,
require
że nie działa tak samo jakreaddirSync
!Po drugie - jesteś bardzo ograniczony w relacjach - kod nie zapewnia opcji dla tych asocjacji, więc NIE MOŻESZ tworzyć,
belongsToMany
ponieważ wymagathrough
własności. Możesz zrobić najbardziej podstawowe zestawy.Po trzecie - jesteś bardzo ograniczony w modelowych relacjach! Jeśli czytasz uważnie kod, widać, że stosunki to obiekt zamiast tablicy , więc jeśli chcesz mieć więcej niż jednego skojarzenia tego samego typu (jak o dwa razy
belongsTo
) - nie można!Po czwarte - nie potrzebujesz tego singletona. Każdy moduł w nodejs jest sam w sobie singletonem, więc wszystko to sprawia, że jest dość skomplikowane bez powodu.
Powinieneś zobaczyć odpowiedź Farmy! (Link do artykułu jest uszkodzony, ale naprawię to za pomocą tej oficjalnej próbki z sequelize: https://github.com/sequelize/express-example/blob/master/models/index.js - możesz przeglądać cały projekt, aby zorientować się, co się dzieje).
ps Edytuję ten post, ponieważ jest tak pozytywnie przyjęty, że ludzie nawet nie zobaczą żadnych nowych odpowiedzi (tak jak ja).
Edycja: Właśnie zmieniłem link na kopię tego samego posta, ale na stronie Github
źródło
require
moduły d w węźle były w pewnym sensie singletonami, ponieważ kod w nich jest wykonywany raz, a następnie buforowany, więc następnym razem, gdy ich potrzebujesz, otrzymujesz buforowane odwołanie do obiektu. Czy to nie jest cały obraz?SequelizeJS ma na swojej stronie artykuł, który rozwiązuje ten problem.
Link jest uszkodzony, ale możesz znaleźć działający przykładowy projekt tutaj i przeglądać go. Zobacz zredagowaną odpowiedź powyżej, aby zobaczyć, dlaczego jest to lepsze rozwiązanie.
Wyciąg z artykułu:
modele / index.js
Ideą tego pliku jest skonfigurowanie połączenia z bazą danych i zebranie wszystkich definicji modelu. Gdy wszystko będzie gotowe, wywołamy metodę skojarzoną z każdym z modeli. Tej metody można użyć do powiązania Modelu z innymi.
źródło
sequelize
zmiennej w pliku modelu, możesz uzyskać dostęp do innego modelu za pomocąsequelize.models.modelName
.Stworzyłem pakiet sequelize-connect, aby pomóc ludziom poradzić sobie z tym problemem. Jest zgodny z sugerowaną konwencją Sequelize tutaj: http://sequelize.readthedocs.org/en/1.7.0/articles/express/
Dodatkowo działa trochę bardziej jak Mongoose pod względem interfejsu. Umożliwia określenie zestawu lokalizacji, w których znajdują się modele, a także pozwala zdefiniować niestandardową funkcję dopasowywania, aby dopasować pliki modelu.
Użycie jest zasadniczo takie:
Następnie możesz uzyskać dostęp do modeli i kontynuować w ten sposób:
Mam nadzieję, że to komuś pomoże.
źródło
Zacząłem używać Sequelize w aplikacji Express.js. Wkrótce natrafiłem na problemy natury, którą opisujesz. Może nie do końca rozumiałem Sequelize, ale robienie rzeczy więcej niż tylko wybieranie z jednego stołu nie było zbyt wygodne. A tam, gdzie normalnie używałbyś select z dwóch lub więcej tabel lub unii w czystym SQL, musiałbyś uruchamiać oddzielne zapytania, a przy asynchronicznej naturze Node jest to po prostu dodatkowa złożoność.
Dlatego odeszłam od używania Sequelize. Ponadto przechodzę z używania DOWOLNEGO pobierania danych z DB w modelach. Moim zdaniem lepiej jest abstrakcyjne pobieranie danych. Powody są takie - wyobraź sobie, że nie korzystasz tylko z MySQL (w moim przypadku używam MySQL i MongoDB obok siebie), ale możesz uzyskać dane od dowolnego dostawcy danych i dowolnej metody transportu, np. SQL, no-SQL, system plików, zewnętrzne API, FTP, SSH itp. Gdybyś próbował zrobić to wszystko w modelach, ostatecznie stworzyłbyś złożony i trudny do zrozumienia kod, który byłby trudny do aktualizacji i debugowania.
Teraz to, co chcesz zrobić, to mieć modele uzyskać dane z warstwy, która wie, gdzie i jak je zdobyć, ale twoje modele wykorzystują tylko metody API, na przykład
fetch
,save
,delete
etc. i wewnątrz tej warstwy masz konkretne implementacje dla konkretnych dostawców danych. Na przykład możesz zażądać pewnych danych z pliku PHP na komputerze lokalnym lub z interfejsu API Facebooka lub z Amazon AWS lub ze zdalnego dokumentu HTML itp.PS Niektóre z tych pomysłów zostały zapożyczone od Architect by Cloud9 : http://events.yandex.ru/talks/300/
źródło
fetch
,save
,delete
itp pozaSequelize
podano, że ramy już zapewnia środki. Jest ładniej, ale mniej wygodnie jest mieć oddzielną warstwę pobierania. W tym samym czasie prawdopodobnie mógłbyś dodać pobierającą warstwę abstrakcji dookoła Sequelize, ale wtedy rozwiązanie jest bardziej skomplikowane, co daje sporne zwycięstwo.Ustawiłem to jako Farmę i opisałem w dokumentacji.
Ale miałem dodatkowy problem polegający na tym, że w moich metodach instancji i metodach klas, które chciałbym dołączyć do modeli w każdej funkcji, musiałbym wymagać pliku indeksu, aby uzyskać dostęp do innych obiektów bazy danych.
Rozwiązałem to, udostępniając je wszystkim modelom.
Oraz w pliku modelu
Zrobiłem to tylko dla metod klasowych, ale możesz też zrobić to samo na przykład dla metod.
źródło
Kieruję się oficjalnym przewodnikiem: http://sequelizejs.com/heroku , który ma folder modeli, konfiguruję każdy moduł w osobnych plikach i mam plik indeksu, aby je zaimportować i ustawić relacje między nimi.
źródło
Przykładowy model sequelize
źródło
Możesz importować modele z innych plików za pomocą
sequelize.import
http://sequelizejs.com/documentation#models-importW ten sposób możesz mieć jeden pojedynczy moduł do kontynuacji, który następnie ładuje wszystkie inne modele.
W rzeczywistości ta odpowiedź jest dość podobna do odpowiedzi użytkownika1778770.
źródło
Możesz być zainteresowany spojrzeniem na rozwiązanie standardowe PEAN.JS.
Projekt PEAN jest rozwidleniem projektu MEAN.JS (nie mylić z MEAN.IO lub ogólnym stosem MEAN).
PEAN zastępuje MongoDB i Mongoose ORM PostgreSQL i Sequelize. Podstawową zaletą projektu MEAN.JS jest organizacja stosu, który ma wiele ruchomych elementów.
źródło
Możesz również użyć iniekcji zależności, która zapewnia eleganckie rozwiązanie tego problemu. Oto jeden https://github.com/justmoon/reduct
źródło