7 marca 2025 (updated: 7 marca 2025)
Chapters
Po wybraniu bazy danych MongoDB w swoim systemie, prawdopodobnie będziesz również korzystać z biblioteki ODM. Najpopularniejsza jest Mongoose lub biblioteka zbudowana na jej podstawie - Typegoose. W tym artykule omówimy ich główne różnice w pracy z frameworkiem NestJS.
Prawdopodobnie już wiesz, że Typegoose to w zasadzie sposób na użycie Mongoose z TypeScript i to będzie Twoje kryterium przy wyborze biblioteki. Ale jest to nieco bardziej skomplikowane w przypadku pracy z frameworkiem NestJS, ponieważ istnieje wrapper Mongoose stworzony przez autorów NestJS - @nestjs/mongoose, a gdy spojrzysz na składnię - wydaje się niemal identyczna z Typegoose.
Rozłóżmy różnice między nimi, aby łatwiej było zdecydować, jakie podejście powinieneś wybrać w swoim projekcie - używając pakietu @nestjs/mongoose lub Typegoose. Integrując MongoDB z aplikacją NestJS, znajdziesz przykłady i fragmenty kodu demonstrujące, jak skonfigurować aplikację NestJS do pracy z MongoDB przy użyciu TypeScript i pakietów takich jak Typegoose.
@nestjs/mongoose to biblioteka dedykowana frameworkowi Nest, więc oferuje pełne wsparcie dla jego workflow DI. Z drugiej strony, Typegoose może być używany w każdym innym projekcie NodeJS, więc będziesz musiał samodzielnie zintegrować go z Nest lub skorzystać z pakietów społecznościowych.
Chociaż oba pakiety pozwalają na definiowanie schematów za pomocą podobnych dekoratorów, ich interfejsy różnią się, a Typegoose oferuje więcej opcji niż wrapper Nest. Na przykład - dekorator `@Schema()` przyjmuje tylko zdefiniowane opcje schematu Mongoose, podczas gdy `@modelOptions()` oprócz tego oferuje dostęp do istniejącego połączenia oraz kilka niestandardowych opcji konfiguracyjnych Typegoose.
W przypadku `@nestjs/mongoose`, jeśli chcesz ręcznie zmodyfikować definicję schematu na podstawie metadanych, możesz użyć klasy `DefinitionsFactory`. Podejście to może być przydatne, gdy trudno jest przedstawić wszystko za pomocą dekoratorów.
Oba pakiety pozwalają na definiowanie metod instancyjnych i statycznych. Oto przykłady, jak możemy definiować metody klas w obu pakietach:
Jak widać, musimy tworzyć dodatkowe interfejsy przy użyciu mongoose, natomiast Typegoose pozwala nam uzyskać informacje o typach z klas. Definicje są również bardziej naturalne, ponieważ są zawarte w klasie jak zwykłe metody. W pakiecie Nest musisz używać właściwości `statics` i `methods` poza klasą, co nieco obniża czytelność i staje się mniej naturalnym podejściem, jeśli chodzi o używanie klas.
Oba pakiety wspierają hooki. W @nestjs/mongoose możesz ich używać w metodzie fabrycznej importów modułów. Typegoose oferuje wsparcie za pomocą dekoratorów @pre() i @post().
Możesz dodać niestandardowe zapytania w obu pakietach, ale prawdopodobnie napotkasz problemy z typami w Mongoose. Różnica między metodą zapytania a funkcją statyczną w modelu polega na tym, że funkcja nie będzie mogła być łańcuchowana.
Właściwości wirtualne można tworzyć w Typegoose za pomocą funkcji get & set ES6, podczas gdy w przypadku pakietu Nest musisz użyć właściwości `virtual` poza klasą, co, podobnie jak metody klasowe, wydaje się mniej naturalne w użyciu.
Chociaż Mongoose potrafi już wnioskować typy z definicji schematu, a jego wrapper Nest ma fajne funkcje, to nadal bardziej skorzystasz na używaniu Typegoose. Posiada on również lepszą dokumentację i wsparcie społeczności. Pytanie brzmi - czy masz czas i zasoby, aby zintegrować Typegoose z Twoim projektem Nest? Jeśli tak, osobiście dałbym mu szansę.