7 marca 2025 (updated: 7 marca 2025)

Mongoose vs Typegoose w NestJS

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.

      Główne różnice

      Połączenie i wstrzykiwanie modelu z bazą danych MongoDB

      @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.

      Definicja schematu

      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.

      Metody klas

      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.

      Hooks

      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().

      Metody zapytań niestandardowych

      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.

      Wirtualne

      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.

      Który z nich powinieneś wybrać?

      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ę.

      Sprawdź także

      Paweł Sierant

      Backend Developer

      Może to początek pięknej przyjaźni?

      Jesteśmy dostępni dla nowych projektów.

      Contact us