node.js - Vad är det bästa sättet att lägga till förinställd data i en databas i Nest.JS när man startar appen för första gången?
Jag har en databas med ganska många tabeller, och några av dessa tabeller behöver ha standardinformation i sig - saker som kategorier, behörigheter, roller, taggar, etc. och jag vill se till att exakt denna information har förutsägbara ID:n varje gång appen startas från början på en ny installation (i produktion eller till och med under utveckling) - helst när, eller strax efter, att tabellerna har skapats.
Just nu använder jag NestJS, sequelize-typescript och MariaDB, men jag kan komma att byta ORM eller databas i framtiden. Sequelize har 'seed'-funktionen, men:
- Jag skulle föredra att bara använda det för att lägga till testdata. Att behöva separera nödvändig data från testdata är potentiellt mycket extra arbete.
- Det finns lite extra magi i mina servicefiler som kan behöva ske innan man lägger till data - som att bestämma vad en kat egoris föräldra-ID är. Det kan tekniskt sett återskapas i en seed-fil, men det skulle vara extra arbete och kräva antaganden som den infogade förälderns ID (vilket skulle vara lättare om jag använde en service).
- Igen, jag kan byta till något som TypeORM eller till och med ändra allt helt till Mongoose.
- Jag skulle bara föredra att använda Nest för detta - ifall jag glömmer att köra seed-kommandot, så att jag inte behöver installera sequelize-cli på produktion, och några andra mindre anledningar.
Så jag hoppas att det finns något jag missar i dokumentationen, eller något NestJS-vänligt, databas/ORM-oberoende sätt att lägga till startdata i mina tabeller. Helst skulle jag vilja göra detta per modul och använda den modulens servicefil(er) för att hålla allt separerat och garantera att datan läggs till korrekt utan att behöva skriva om mycket logik.
Så, finns det ett databas-/ORM-agnostiskt sätt att fixa detta utan att använda sequelize-cli?
Det behöver inte ens vara något som bara kallas när tabellerna skapas först - det kan vara något som kallas varje gång appen startas, och låta det kontrollera om datan redan finns.
Svar #1
Jag är inte övertygad om att det nödvändigtvis är den bästa idén att mata in dina data genom ditt API, men om jag bortser från min åsikt är här vad jag förmodligen skulle göra.
NestJS exponerar inte någon livscykelhooks för efter att applikationen har börjat lyssna ref. Det betyder att du inte kan kapsla in den logiken i en tjänst. Istället måste du köra den logiken i bootstrap-sekvensen efter att appen börjar lyssna. Om din seed-logik behöver information från tjänster kan du komma åt deras instanser med app.get(<injectable-class-or-token>).
När det gäller själva datan, om den verkligen behöver genereras dynamiskt, kan du lika gärna bara skriva ett skript för det med TypeScript. I så fall, om du vill ha deterministisk data, kanske du vill sätta en seed för din RNG (eller vilken bibliotek du än använder för att generera data). Annars kan du hårdkoda din data i skriptet eller läsa den från andra filer i vilket format du föredrar (JSON, CSV, etc.).
I huvudsak har du ett .ts-skript som är ansvarigt för att generera (eller läsa) dina startdata och skicka dem till ditt API. Det skriptet körs efter att din app lyssnar i din bootstrap-sekvens och det kan få åtkomst till information från dina tjänster om det behövs.
Svarar det på din fråga?