Rakenna oma API käyttämällä näitä suosittuja verkkotekniikoita.

GraphQL ja NestJS muodostavat erinomaisen kumppanuuden, joka antaa sinulle vankan perustan sovellusliittymillesi ja helppokäyttöisen kehyksen skaalautuvien verkkosovellusten rakentamiseen. Yhdistelmä sopii täydellisesti tuotantovalmiiden sovellusten rakentamiseen, ja molemmat ovat erittäin tärkeitä työkaluja nykypäivän teknologisessa ekosysteemissä.

Lue lisää API: n rakentamisesta molempien tuotteiden avulla.

Mikä on GraphQL?

GraphQL on datakysely- ja käsittelykieli voit käyttää API: iden rakentamiseen tarkemmalla ja tiiviimmällä tavalla. GraphQL tarjoaa täydellisen ja riittävän kuvauksen API: ssa olevista tiedoista ja antaa asiakkaalle valtuudet saada tarkat tarvittavat tiedot.

GraphQL tarjoaa monia ominaisuuksia, joita REST-sovellusliittymistä puuttuu, aina tarkoista tietokyselyistä parempiin kehittäjätyökaluihin, kuten graphiql toimittaja. Sen avulla voit myös hakea useita resursseja yhdellä pyynnöllä.

Mikä on NestJS?

NestJS on progressiivinen Node.js-kehys, jonka avulla voit rakentaa skaalautuvia ja tehokkaita palvelinpuolen sovelluksia. NestJS tarjoaa monia laajennuksia sekä työkaluja nopeaa ja helppoa kehitystä varten, mukaan lukien GraphQL-tuki, GRPC, WebSockets jne.

instagram viewer

NestJS tunnetaan ekosysteemissä optimoidusta projektirakenteestaan, joka käyttää moduuleja, ohjaimia, palveluita ja skeemoja. Sen sisäänrakennetun CLI: n avulla voit luoda jäsennellyn API-arkkitehtuurin. Voit käyttää riippuvuuden injektioperiaatteet hallita, kuinka sovelluksen osat kommunikoivat keskenään.

GraphQL: n käyttöönotto NestJS: n ja MongoDB: n kanssa

Ennen kuin rakennat sovellusliittymän NestJS: n ja GraphQL: n kanssa, sinulla on oltava saatavilla oikeat riippuvuudet. Tarvitset Node.js: n asentamiseen ja NestJS, jonka voit asentaa suorittamalla npm i -g @nestjs/cli.

Seuraava esimerkki on yksinkertainen sovellus, joka tallentaa tietoja kirjoista. Luo uusi NestJS-sovellus suorittamalla seuraava komento päätteessäsi:

pesä uusi 

Siirry luodun sovelluksen hakemistoon () ja asenna sen riippuvuudet seuraavalla komennolla:

$ npm install --tallenna @nestjs/config @nestjs/graphql graphql-tools graphql \
 @nestjs/apollo apollo-server-express @nestjs/mongoose @types/graphql

GraphQL-sovellusliittymien rakentamiseen on kaksi päätapaa, nimittäin:

  1. Kaavio ensimmäinen lähestymistapa: jossa kuvataan API skeeman määritystiedostoissa tai SDL: ssä, ja NestJS luo Typescript-määritykset niiden perusteella.
  2. Koodi ensimmäinen lähestymistapa: jossa määrität kyselyt, mutaatiot ja muut GraphQL-toiminnot Typescript-luokkien ja koristeiden avulla, ja NestJS luo SDL-tiedostoja niiden perusteella.

Seuraavassa esimerkissä kuvataan koodien ensimmäinen lähestymistapa.

Ensin sinun on alustettava GraphQL AppModule ja yhdistä se MongoDB-tietokantaan:

// app.module.ts
tuonti { Moduuli } alkaen"@nestjs/common";
tuonti { GraphQLM-moduuli kuten NestGraphQLM-moduuli } alkaen'@nestjs/graphql';
tuonti { ApolloDriver, ApolloDriverConfig } alkaen'@nestjs/apollo';
tuonti { liittyä seuraan } alkaen'polku';
tuonti { MongooseModule } alkaen"@nestjs/mangoose";
tuonti { AppController } alkaen'./app.controller';
tuonti { AppService } alkaen'./app.service';
tuonti { ConfigModule, ConfigService } alkaen'@nestjs/config';
tuonti mongodbConfig alkaen'./config/mongodb.config';

@Moduuli({
tuonti: [
ConfigModule.forRoot({
lataus: [mongodbConfig],
isGlobal: totta
}),
NestGraphQLModule.forRootAsync({
kuljettaja: ApolloDriver,
inject: [ConfigService],
useFactory: asynk (configService: ConfigService) => ({
autoSchemaFile: liity (process.cwd(), 'src/schema.gql'),
installSubscriptionHandlers: totta,
sortSchema: totta,
leikkikenttä: totta,
debug: configService.get<boolean>("DEBUG"),
lataukset: väärä,
}),
}),
MongooseModule.forRootAsync({
inject: [ConfigService],
useFactory: asynk (configService: ConfigService) => ({
uri: configService.get("MONGO_URI")
})
}),
],
ohjaimet: [AppController],
palveluntarjoajat: [AppService],
})

viedäluokkaa AppModule {}

Tämä moduuli tuo GraphQLM-moduuli alkaen @nestjs/graphql ja MongooseModule alkaen @nestjs/mangoose joka auttaa muodostamaan yhteyden MongoDB: hen. The autoSchemaFile ominaisuus määrittää luodun skeematiedoston sijainnin ja sortSchema Ominaisuus varmistaa, että se järjestää kentät aakkosjärjestyksessä.

Tässä on MongoDB: si config tiedoston pitäisi näyttää tältä:

tuonti { rekisteröidä nimellä } alkaen'@nestjs/config';

/**
 * Mongo-tietokantayhteyden konfiguraatio
 */
viedäoletuksena registerAs("mongodb", () => {
konst {
MONGO_URI
} = process.env;

palata {
uri: `${MONGO_URI}`,
};
});

GraphQL-skeeman määrittäminen

Kun olet määrittänyt GraphQL- ja MongoDB-yhteydet, sinun tulee määrittää GraphQL-kyselyt ja mutaatiot skeeman luomiseksi (schema.gql) tiedosto.

Kyselyjen kirjoittaminen

Vuonna koodien ensimmäinen lähestymistapa, luot mallin käyttämällä Objektityyppi sisustusarkkitehti. Myöhemmin muutat tämän mallin GraphQL-tyypiksi.

Esimerkiksi:

// book.model.ts
tuonti { Kenttä, objektityyppi } alkaen'@nestjs/graphql';
tuonti { Prop, Schema, SchemaFactory } alkaen"@nestjs/mangoose";
tuonti { Asiakirja } alkaen'mungo';

viedätyyppi BookDocument = Kirja & asiakirja;

@ObjectType()
@Schema()
viedäluokkaa Varaa {
@Ala()
otsikko: merkkijono;

@Ala()
kirjoittaja: merkkijono;

@Ala()
julkaisupäivämäärä: boolean;
}

viedäkonst BookSchema = SchemaFactory.createForClass (Kirja);

GraphQL ei oletuksena voi käyttää luotuja skeemoja. Jotta ne toimisivat, tarvitset ratkaistava palvelun, joka sisältää toiminnot GraphQL-tyyppien suorittamiseen. Voit tehdä sen kanssa Ratkaisija sisustusarkkitehti.

// books.resolver.ts
tuonti { Ratkaisija, Kysely, Mutaatio, Args, ID } alkaen'@nestjs/graphql';
tuonti { Kirja } alkaen'./book.model';
tuonti { Kirjapalvelu } alkaen'./books.service';

@Resolver(() => Kirja)
viedäluokkaa BookResolver {
rakentaja(yksityinen vain luku -kirjapalvelu: BookService) { }

@Kysely(() => [Kirja])
asynk kirjat (): Lupaus {
palataTämä.bookService.findAll();
}

@Kysely(() => Kirja)
asynk kirja(@Args('id', { tyyppi: () => Minä tein: merkkijono): Lupaus {
palataTämä.bookService.findOne (id);
}
}

Voit toteuttaa Kirjapalvelu, tuotu edellä seuraavasti:

// books.service.ts
tuonti { Injektoitava } alkaen"@nestjs/common";
tuonti { InjectModel } alkaen"@nestjs/mangoose";
tuonti { Malli } alkaen'mungo';
tuonti { Kirja, kirjaasiakirja } alkaen'./book.model';

@Injektoitava()
viedäluokkaa Kirjapalvelu {
rakentaja(@InjectModel(Kirja.nimi) yksityinen kirjaMalli: Malli) { }

asynk löydä kaikki(): Lupaus {
palataTämä.bookModel.find().exec();
}

asynk findOne (id: merkkijono): Lupaus {
palataTämä.bookModel.findById (id).exec();
}
}

Sinun on myös lisättävä BookResolver palveluntarjoajien luetteloon books.module.ts.

tuonti { Moduuli } alkaen"@nestjs/common";
tuonti { MongooseModule } alkaen"@nestjs/mangoose";
tuonti { Kirjapalvelu } alkaen'./books.service';
tuonti { BookResolver } alkaen'./books.resolver';
tuonti { Kirja, BookSchema } alkaen'./book.model';

@Moduuli({
palveluntarjoajat: [
Kirjapalvelu,
BookResolver
],
tuonti: [MongooseModule.forFeature([
{
nimi: Kirja.nimi,
skeema: BookSchema,
},
]),
],
})

viedäluokkaa KirjatModuuli {}

Mutaatioiden kanssa työskentely

Kun käytät kyselyä tietojen hakemiseen GraphQL: ssä, mutaatiot luovat tai päivittävät tietoja tietokantaan. Mutaatioiden luomiseksi sinun on hyväksyttävä tietoja käyttäjiltä. The Syötteen tyyppi decorator, joka muuttaa luokan GraphQL-syöttötyypiksi, on hyödyllinen tässä.

// book.input.ts
tuonti { InputType, Field } alkaen'@nestjs/graphql';

@Syötteen tyyppi()
viedäluokkaa BookInput {
@Ala()
otsikko: merkkijono;

@Ala()
kirjoittaja: merkkijono;

@Ala()
julkaisupäivämäärä: boolean
}

Voit nyt päivittää books.resolver.ts näyttää tältä:

tuonti { Ratkaisija, Kysely, Mutaatio, Args, ID } alkaen'@nestjs/graphql';
tuonti { Kirja } alkaen'./book.model';
tuonti { Kirjapalvelu } alkaen'./books.service';
tuonti { Kirjansyöttö } alkaen'./book.input';

@Resolver(() => Kirja)
viedäluokkaa BookResolver {
rakentaja(yksityinen vain luku -kirjapalvelu: BookService) { }

@Mutaatio(() => Kirja)
asynk luoKirja(@Args("syöttö") syöttö: BookInput): Lupaus {
palataTämä.bookService.create (syöttö);
}

@Mutaatio(() => Kirja)
asynk päivitäkirja(
@Args('id', { tyyppi: () => Minä tein: merkkijono,
@Args("syöttö") tulo: BookInput,
): Lupaus {
palataTämä.bookService.update (tunnus, syöttö);
}

@Mutaatio(() => Kirja)
asynk deleteBook(@Args('id', { tyyppi: () => Minä tein: merkkijono): Lupaus {
palataTämä.bookService.delete (id);
}
}

Ja books.service.ts kuten tämä:

tuonti { Injektoitava } alkaen"@nestjs/common";
tuonti { InjectModel } alkaen"@nestjs/mangoose";
tuonti { Malli } alkaen'mungo';
tuonti { Kirja, kirjaasiakirja } alkaen'./book.model';

@Injektoitava()
viedäluokkaa Kirjapalvelu {
rakentaja(@InjectModel(Kirja.nimi) yksityinen kirjaMalli: Malli) { }

asynk luo (kirja: Kirja): Lupaus {
konst uusi kirja = UusiTämä.bookModel (kirja);
palata newBook.save();
}

asynk päivitys (id: merkkijono, kirja: Kirja): Lupaus {
palataTämä.bookModel.findByIdAndUpdate (id, book, { Uusi: totta }).exec();
}

asynkpoistaa(tunnus: merkkijono): Lupaus {
palataTämä.bookModel.findByIdAndDelete (id).exec();
}
}

The @Mutaatio decorator merkitsee funktion mutaatiotyypiksi ja @Args sisustaja tarttuu kaikkiin toimintoon siirrettyihin tuloihin.

Lopuksi sinun tulee tuoda KirjatModuuli sisään AppModule jotta se olisi toimiva. Sinun tulee myös läpäistä KirjatModuuli to forRootAsync kuten alla näkyy.

tuonti { BooksModule } alkaen'./books/books.module';
/**
 * muu tuonti
*/

@Moduuli({
tuonti: [
ConfigModule.forRoot({
lataus: [mongodbConfig],
isGlobal: totta
}),
NestGraphQLModule.forRootAsync({
kuljettaja: ApolloDriver,
inject: [ConfigService],
useFactory: asynk (configService: ConfigService) => ({
autoSchemaFile: liity (process.cwd(), 'src/schema.gql'),
installSubscriptionHandlers: totta,
sortSchema: totta,
leikkikenttä: totta,
debug: configService.get<boolean>("DEBUG"),
lataukset: väärä,
}),
}),
MongooseModule.forRootAsync({
inject: [ConfigService],
useFactory: asynk (configService: ConfigService) => ({
uri: configService.get("MONGO_URI")
})
}),
Kirjamoduuli,
],
ohjaimet: [AppController],
palveluntarjoajat: [AppService],
})

viedäluokkaa AppModule {}

Voit testata koodia suorittamalla npm ajon aloitus: dev terminaalissasi, ja sovelluksesi pitäisi käynnistyä onnistuneesti portissa 3000.

Avata localhost: 3000/graphql selaimessasi näyttääksesi Graphiql käyttöliittymä, jossa voit testata kyselyitä ja mutaatioita. Tässä on esimerkki kyselystä:

Ja tässä on esimerkki mutaatiosta:

Rakenna tehokkaita sovellusliittymiä NestJS: n ja GraphQL: n avulla

GraphQL-sovellusliittymän rakentaminen NestJS: ssä MongoDB: n avulla Mongoose-sovelluksella edellyttää skeeman määrittämistä GraphQL API: lle, skeemalle. Mongoose-mallia varten palvelu, joka on vuorovaikutuksessa tietokannan kanssa, ja ratkaisija GraphQL-toimintojen yhdistämiseksi palveluun menetelmiä.

NestJS: ssä on sisäänrakennetut toiminnot sovellusliittymien rakentamiseen, mukaan lukien sisustajat reittien määrittämiseen, vartijat niiden suojaamiseen ja väliohjelmistot pyyntöjen ja vastausten käsittelyyn. Se tukee myös muita tietokantoja, kuten PostgreSQL, MySQL ja SQLite, sekä muita GraphQL-kirjastoja, kuten Apollo ja TypeGraphQL.