Typegoose - Määritä Mongoose -mallit TypeScript -luokkien avulla

Blogi

Typegoose - Määritä Mongoose -mallit TypeScript -luokkien avulla

Peruskäyttö

import { prop, getModelForClass } from '@typegoose/typegoose'; import * as mongoose from 'mongoose'; class User { @prop() name?: string; } const UserModel = getModelForClass(User); // UserModel is a regular Mongoose Model with correct types (async () => { await mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true }); const { _id: id } = await UserModel.create({ name: 'JohnDoe' }); const user = await UserModel.findById(id).exec(); console.log(user); // prints { _id: 59218f686409d670a97e53e0, name: 'JohnDoe', __v: 0 } })();

Motivaatio

Yleinen ongelma käytettäessä Mongoosea TypeScriptin kanssa on, että sinun on määritettävä sekä Mongoose -malli että TypeScript -käyttöliittymä. Jos malli muuttuu, sinun on myös pidettävä TypeScript -rajapintatiedosto synkronoituna, tai TypeScript -käyttöliittymä ei edusta mallin todellista tietorakennetta.

Typegoose pyrkii ratkaisemaan tämän ongelman määrittelemällä vain TypeScript -rajapinnan (luokka), jota on parannettava erityisillä Typegoose -koristeilla.

Hupun alla käytetään Reflect & heijastavat metatiedot Sovellusliittymä ominaisuuksien tyyppien noutamiseen, joten redundanssi voidaan vähentää merkittävästi.

Time Warner -kaapelin salasana

Sijasta:

interface Car { model?: string; } interface Job { title?: string; position?: string; } interface User string; mongoose.model('User', { name: String, age: { type: Number, required: true }, job: { title: String; position: String; }, car: { type: Schema.Types.ObjectId, ref: 'Car' } }); mongoose.model('Car', { model: string, });

Voit vain:

class Job { @prop() title?: string; @prop() position?: string; } class Car { @prop() model?: string; } class User { @prop() name?: string; @prop({ required: true }) age!: number; @prop() job?: Job; @prop({ ref: Car }) car?: Ref; }

Huomaa, että alaasiakirjojen ei tarvitse ulottua Typegoose -pidennykseen. Voit silti antaa heille oletusarvon muodossa | _+_ | koristelija, mutta et voi luoda niihin staattisia tai ilmentymämenetelmiä.


Vaatimukset

  • TypeScript 3.2+
  • Solmu 8+
  • mungo ^5.7.1
  • | _+_ | ja | _+_ | on otettava käyttöön | _+_ |

Asentaa

prop

Sinun on myös asennettava | _+_ |, koska versio 5 on listattu vertaisriippuvuudeksi

emitDecoratorMetadata

Siirry versioon 6.0.0

Testaus

experimentalDecorators

Versiointi

| _+_ | (tai miten npm ilmaisee sen | _+_ |)
(Tämän projektin tulee noudattaa Semver )

API -dokumentaatio

Käytä, kiitos uudet oppaat ja uudet dokumentit Tämä on vain perinnöllisistä syistä, ja se voidaan poistaa myöhemmin

Typegoose -luokka

Koska 6.0.0 on vanhentunut, yritä poistaa se

### Menetelmät

tsconfig.json

Tämä menetelmä palauttaa luokan vastaavan Mongoose -mallin (| _+_ |). Jos tälle luokalle ei ole vielä olemassa Mongoose -mallia, malli luodaan automaattisesti (kutsumalla menetelmää | _+_ |).

npm i -s @typegoose/typegoose

Tämä menetelmä on vanhentunut, katso Siirry versioon 6.0.0

Kiinteistön sisustajat

Typegoosen mukana tulee TypeScript -sisustajat, joiden vastuulla on yhdistää Mongoose -malli TypeScript -luokan taakse.

prop (vaihtoehdot)

| _+_ | decorator lisää kohdeluokan ominaisuuden Mongoose -skeemalle ominaisuutena. Typegoose tarkistaa koristetun ominaisuuden tyypin ja asettaa kaavion ominaisuuden sen mukaisesti. Jos tyypiksi annetaan toinen Typegoose -laajennusluokka, Typegoose tunnistaa tämän ominaisuuden alidokumentiksi.

| _+_ | objekti hyväksyy useita määritysominaisuuksia:

  • | _+_ |: Aivan kuten Mongoose vaaditaan se hyväksyy kourallisen parametreja. Huomaa, että kehittäjän vastuulla on varmistaa, että jos | _+_ | on asetettu | _+_ | silloin luokan omaisuuden pitäisi olla valinnainen .

    Huomautus: koodaustyyliin (ja tyypin viimeistelyyn) tulee käyttää | _+_ | kun se on merkitty tarpeelliseksi

    mongoose
  • | _+_ |: Kertoo Mongooseelle, määritetäänkö ominaisuusindeksi.

    npm i -s mongoose
  • | _+_ |: Aivan kuten Ainutlaatuinen mongoose , kehottaa Mongoosea varmistamaan, että tälle polulle luodaan ainutlaatuinen hakemisto.

    npm test
  • | _+_ |: Enum -vaihtoehto hyväksyy merkkijonon. Luokkaominaisuuden, joka saa tämän koristeen, pitäisi olla enum-tyyppinen tyyppi, jonka arvot ovat annetusta merkkijonosta. Tapa, jolla enum luodaan, siirretään kehittäjälle, Typegoose tarvitsee merkkijonon, joka sisältää enum -arvot, ja TypeScript -tyypin, joka kertoo enumin mahdolliset arvot. Jos kuitenkin käytät TS 2.4+: a, voit käyttää myös merkkijonoa.

    Major.Minor.Fix
  • | _+_ |: vain merkkijonoille; soitetaanko arvoon aina .toLowerCase ().

    Major.Minor.Patch
  • | _+_ |: vain merkkijonoille; kutsutaanko aina arvoon .toUpperCase ().

    getModelForClass(cl: T)
  • | _+_ |: vain merkkijonoille; soitetaanko arvoon aina .trim ().

    T
  • | _+_ |: Annettu arvo on kyseisen Mongoose -ominaisuuden oletusarvo.

    setModelForClass
  • | _+_ |: Jos arvo on väärä, alidokumenttiin ei lisätä _id -tunnusta

    setModelForClass(cl: T)
  • | _+_ |: Lisäämällä | _+_ | vaihtoehto, jonka arvo on toinen Typegoose -luokka, luodaan Mongoose -viiteominaisuus. Typegoose -laajennusluokan ominaisuuden tyypin tulisi olla | _+_ | (katso Tyypit -osio).

    prop
  • | _+_ |: On sama kuin | _+_ |, vain siinä, että se katsoo määritettyä polkua ja tämä polku päättää käytettävän mallin

    options
  • | _+_ | / | _+_ | (numeeriset validoijat): Sama kuin Mongoose -numeeriset validoijat .

    required
  • | _+_ | / | _+_ | / | _+_ | (merkkijonon validoijat): Sama kuin Mongoose -merkkijonon validoijat .

    required
  • | _+_ | (mukautetut validoijat): Tällä voit määrittää oman validointitoiminnon/säännöllisen lausekkeen. Funktion on palautettava | _+_ | tai lupaus (asynkronointivalidointi).

    www aol com sähköposti kirjaudu sisään
    false
  • | _+_ | (alias): Sama kuin Mongoose -alias , Ainoa ero on lisäominaisuus tyypin viimeistelyyn

    !

Virtuaalinen

  • Mongoose antaa kehittäjille mahdollisuuden luoda virtuaaliset ominaisuudet . Tämä tarkoittaa sitä, että tietokannan varsinaista lukemista/kirjoittamista ei tapahdu, nämä ovat vain 'laskettuja ominaisuuksia'. Virtuaaliesineellä voi olla setteri ja getter. TypeScriptillä on myös samanlainen ominaisuus, jota Typegoose käyttää virtuaalisten ominaisuuksien määritelmissä (käyttämällä | _+_ | koristelijaa).

    esimerkki:

    // this is now required in the schema @prop({ required: true }) firstName!: string; // by default, a property is not required @prop() lastName?: string; // using the ? optional property

    DB -asiakirja:

    index
  • Myös muita kuin virtuaaleja tuetaan:
    esimerkki:

    @prop({ index: true }) indexedField?: string;

    DB -asiakirja:

    unique
  • Virtual-Populate on myös tuettu tekemällä

    // this field is now unique across the collection @prop({ unique: true }) uniqueId?: string;

Asetukset ( katso täältä lisätietoja ):

  • | _+_ |: Tämä on kuin tavallinen viite [Pakollinen]
  • | _+_ |: Mikä ominaisuus (ref-luokassa) vastaa | _+_ | vastaan ​​[Pakollinen]
  • | _+_ |: Mikä ominaisuus (nykyisellä luokalla) vastaa | _+_ | vastaan ​​[Pakollinen]
  • | _+_ |: Palauta yhtenä asiakirjana (tosi) tai taulukkona (epätosi) [valinnainen]
  • | _+_ |: Palauta löydettyjen asiakirjojen määrä todellisten asiakirjojen sijaan [Valinnainen]

arrayProp (vaihtoehdot)

| _+_ | on | _+_ | decorator, jonka avulla voidaan luoda matriisikaavion ominaisuuksia.

| _+_ | objekti hyväksyy | _+_ |, | _+_ | ja | _+_ |, aivan kuten | _+_ | sisustusarkkitehti. Näiden lisäksi on annettava täsmälleen seuraavat ominaisuudet:

  • | _+_ |: Tämä kertoo Typegooselle, että tämä on matriisi, joka koostuu primitiivistä (jos | _+_ |, | _+_ | tai muu primitiivityyppi on annettu) tai tämä on matriisi, joka koostuu alidokumentteista ( jos se laajentaa | _+_ | -luokkaa).

    enum

Huomaa, että valitettavasti heijastavat metatiedot API ei anna meidän määrittää taulukon tyyppiä, se palauttaa vain | _+_ | kun omaisuuden tyyppiä kysytään. Siksi täällä tarvitaan irtisanomisia.

suodatin vs löytää javascript
  • | _+_ |: Keskinäisen poissulkemisen kanssa | _+_ |, tämä kertoo Typegooselle, että tämä on alidokumenttimatriisin sijaan taulukko, jossa on viittauksia. Mongoose -puolella tämä tarkoittaa, että joukko objektitunnuksia tallennetaan tämän ominaisuuden alle. Aivan kuten | _+_ | | _+_ | sisustaja, tämän ominaisuuden tyypin tulisi olla | _+_ |.

    enum Gender { MALE = 'male', FEMALE = 'female', } @prop({ enum: Gender }) gender?: Gender;
  • | _+_ | (IRP): on sama kuin | _+_ | vain, että se tarkastelee luokan määritettyä polkua, joka määrittää käytettävän mallin

    lowercase

mapProp (valinnat)

| _+_ | on | _+_ | decorator, jonka avulla voidaan luoda karttakaavion ominaisuuksia.

Vaihtoehtoobjekti hyväksyy | _+_ | ja | _+_ |, aivan kuten | _+_ | sisustusarkkitehti. Näiden lisäksi hyväksytään seuraavat ominaisuudet:

  • | _+_ | : Tämä kertoo Typegooselle, että kartta -arvo koostuu primitiivistä (jos | _+_ |, | _+_ | tai muu primitiivinen tyyppi on annettu) tai tämä on matriisi, joka koostuu alidokumentteista (jos se laajentaa | _+ _ | luokka).

    @prop({ lowercase: true }) nickName?: string;

Menetelmän sisustajat

Menetelmä Sisustajat ovat vanhentuneet, katso Siirry versioon 6.0.0

Luokan sisustajat

Mongoose antaa kehittäjälle mahdollisuuden lisätä pre- ja post -viestejä koukut / välituotteet kaavaan. Tämän avulla on mahdollista lisätä asiakirjan muunnoksia ja havaintoja ennen validointia tai sen jälkeen, tallentaa ja paljon muuta.

Typegoose tarjoaa tämän toiminnallisuuden TypeScript -luokan sisustajien kautta.

modelOptions

Mallivaihtoehtoja voidaan käyttää kuten alla

uppercase

Vaihtoehdot | _+_ |:

  • | _+_ |: Voidaan myös siirtää olemassa oleva Mongoose -ilmentymä. Typegoose käyttää tämän Mongoose -esiintymän | _+_ | menetelmiä.
  • | _+_ |: Lisä kaavavaihtoehdot voidaan siirtää luodulle skeemalle.
  • | _+_ |: Voidaan myös siirtää olemassa oleva Mongoose -yhteys. Typegoose käyttää tämän Mongoose -esiintymän | _+_ | menetelmiä.

varten

Voimme yksinkertaisesti liittää | _+_ | koristelija Typegoose -luokkaan ja määrittele koukkufunktio kuten normaalisti Mongoose -tilassa. (Menetelmä tukee REGEXP: tä)

@prop({ uppercase: true }) nickName?: string;

Tämä suorittaa esitallennuskoukun joka kerta, kun | _+_ | asiakirja tallennetaan. Esikoukun sisällä Mongoose sitoo asiakirjan | _+_ |.

Huomaa, että lisää kirjoittamistietoja tarvitaan joko antamalla luokka itse tyyppiparametriksi | _+_ | tai selkeyden, joka kertoo TypeScriptille, että | _+_ | on | _+_ | (| _+_ |). Tämä antaa kirjoitustiedot koukkutoiminnon sisällä.

lähettää

Sama kuin | _+_ |, | _+_ | koukku on myös toteutettu luokan sisustajana. Käyttö vastaa Mongoosen tarjoamaa. (Menetelmä tukee REGEXP: tä)

trim

Tietysti | _+_ | asiakirja ei ole postikoukussa (katso Mongoose -asiakirjat). Kirjoitustietoja vaaditaan jälleen joko nimenomaisella parametrityypillä tai antamalla mallityyppi.

kytkeä

Käyttämällä | _+_ | decoratorin avulla kehittäjä voi liittää kaavaan erilaisia ​​Mongoose -laajennuksia. Aivan kuten tavallinen | _+_ | kutsuja, sisustaja hyväksyy 1 tai 2 parametria: itse laajennuksen ja valinnaisen kokoonpano -objektin. Useita | _+_ | koristelijaa voidaan käyttää yhdessä Typegoose -luokassa.

Jos laajennus parantaa kaavaa lisäominaisuuksilla tai instanssi / staattisilla menetelmillä, tämä kirjoittamistieto on lisättävä manuaalisesti myös Typegoose -luokkaan.

@prop({ trim: true }) nickName?: string;

indeksi

| _+_ | decoratorilla voidaan määrittää edistyneitä hakemistotyyppejä ja hakemistovaihtoehtoja, joita ei ole saatavana | _+_ | vaihtoehdon | _+_ | ominaisuuskoristelija, kuten yhdistelmäindeksit, GeoJSON -hakemistotyypit, osittaiset indeksit, vanhentuneet asiakirjat jne. MongoDB: n createIndex () ovat voimassa myös | _+_ |. Lisätietoja on käyttöliittymässä | _+_ |

default

Tyypit

Joitakin muita tyyppejä lisättiin, jotta Typegoose olisi käyttäjäystävällisempi.
(joillekin muille tyypeille, joita ei ole oletuksena viety, pääsee käsiksi | _+_ |)

Dokumentti tyyppi

Tämä on pohjimmiltaan | _+_ |: n looginen 'ja' ja | _+_ |, niin että ilmentymässä ovat käytettävissä sekä Mongoose -instanssin ominaisuudet/toiminnot että käyttäjän määrittämät ominaisuudet/ilmentymämenetelmät.

ReturnModelType

Tämä on | _+_ |: n looginen 'ja' ja | _+_ |, niin että Mongoose -malli luo | _+_ | kirjoitetut esiintymät ja kaikki käyttäjän määrittämät staattiset menetelmät ovat käytettävissä mallissa.

Viite.

Viiteominaisuudet: | _+_ | - | _+_ | jos asuttuja ja | _+_ | jos asumaton. -> tätä varten on TypeGuards -nimisiä tarkistuksia:

  • | _+_ |: palauttaa | _+_ | jos | _+_ | on täynnä, muuten väärin
  • | _+_ |: palauttaa | _+_ | jos | _+_ | on Array JA on täysin asuttu

Parannuksia

  • Lisää testejä:
    • Koukut: lisää koukkutesti ennen ja jälkeen virheen kanssa

Huomautuksia

  • | _+_ | on vertaisriippuvuus ja kehittäjäriippuvuus asentaa se kehitystarkoituksiin
  • Älä lisää kommentteja | _+_ | tai jotain sellaista, käytä reaktioita
  • Tyyppihanhi ei voi voidaan käyttää samannimisten luokkien kanssa, se palauttaa aina ensimmäisen koontiluokan samalla nimellä
  • Kaikki Typegoose -mallit ovat oletuksena tiukkoja ja ei voi muutu!
  • | _+_ | luo kaikki asiakirjat kaikille tiedostoille, joita voidaan käyttää moduuleina (käytetään github-sivuilla)
  • | _+_ | luo dokumentaatiota jopa sisäisille moduuleille
  • Tätä moduulia ei tule käyttää | _+_ |, | _+_ | on lisättävä vähintään, szokodiakos#196

#konekirjoitus #mongodb