Izgradite vlastiti API pomoću ovih popularnih web tehnologija.

GraphQL i NestJS čine izvrsno partnerstvo, dajući vam čvrstu osnovu za vaše API-je i okvir jednostavan za korištenje za izradu skalabilnih web aplikacija. Kombinacija je savršena za izradu aplikacija spremnih za proizvodnju, a oba su vrlo relevantni alati u današnjem tehnološkom ekosustavu.

Saznajte više o tome kako možete izgraditi API koristeći oba proizvoda.

Što je GraphQL?

GraphQL je jezik za upite i manipulaciju podacima možete koristiti za izradu API-ja na precizniji i koncizniji način. GraphQL pruža potpun i adekvatan opis podataka koji postoje u API-ju i daje moć klijentu da dobije točne podatke koji su mu potrebni.

GraphQL pruža mnoge značajke koje nedostaju REST API-jima, u rasponu od preciznih podatkovnih upita do boljeg razvojnog alata, poput graphiql urednik. Također vam omogućuje postavljanje upita za više resursa putem jednog zahtjeva.

Što je NestJS?

NestJS je progresivni okvir Node.js koji možete koristiti za izgradnju skalabilnih i učinkovitih aplikacija na strani poslužitelja. NestJS nudi mnoge dodatke, uz alate za brz i jednostavan razvoj uključujući GraphQL podršku, GRPC, WebSockets itd.

instagram viewer

NestJS je dobro poznat u ekosustavu po svojoj optimiziranoj projektnoj strukturi koja koristi module, kontrolere, usluge i sheme. Njegov ugrađeni CLI omogućuje vam stvaranje strukturirane API arhitekture. Možeš koristiti načela ubrizgavanja ovisnosti za kontrolu načina na koji dijelovi aplikacije međusobno komuniciraju.

Implementacija GraphQL s NestJS i MongoDB

Prije izgradnje API-ja s NestJS i GraphQL, morat ćete imati dostupne odgovarajuće ovisnosti. Trebaš za instaliranje Node.js i NestJS, koje možete instalirati pokretanjem npm i -g @nestjs/cli.

Primjer koji slijedi je jednostavna aplikacija koja pohranjuje podatke o knjigama. Pokrenite sljedeću naredbu na svom terminalu za stvaranje nove NestJS aplikacije:

gnijezdo novo 

Dođite do direktorija generirane aplikacije () i instalirajte njegove ovisnosti sljedećom naredbom:

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

Postoje dva glavna pristupa izgradnji GraphQL API-ja, naime:

  1. Prvi pristup sheme: gdje opisujete API u datotekama definicije sheme ili SDL-u, a NestJS generira Typescript definicije na temelju njih.
  2. Pristup prvom kodu: gdje definirate upite, mutacije i druge GraphQL funkcionalnosti koristeći Typescript klase i dekoratore, a NestJS generira SDL datoteke na temelju njih.

Sljedeći primjer opisuje kako se koristi pristup prvom kodu.

Prvo morate inicijalizirati GraphQL u svom AppModule i spojite ga na MongoDB bazu podataka:

// app.module.ts
uvoz { Modul } iz'@nestjs/common';
uvoz {GrafQLModul kao NestGraphQLModul } iz'@nestjs/graphql';
uvoz { ApolloDriver, ApolloDriverConfig } iz'@nestjs/apollo';
uvoz { pridružiti } iz'staza';
uvoz { MongooseModule } iz'@nestjs/mungos';
uvoz {AppController} iz'./app.controller';
uvoz { AppService } iz'./app.service';
uvoz { ConfigModule, ConfigService } iz'@nestjs/config';
uvoz mongodbConfig iz'./config/mongodb.config';

@Modul({
uvozi: [
ConfigModule.forRoot({
učitaj: [mongodbConfig],
jeGlobalno: pravi
}),
NestGraphQLModule.forRootAsync({
vozač: ApolloDriver,
ubaci: [ConfigService],
useFactory: asinkroni (configService: ConfigService) => ({
autoSchemaFile: pridruži se (process.cwd(), 'src/schema.gql'),
installSubscriptionHandlers: pravi,
shema sortiranja: pravi,
igralište: pravi,
debug: configService.get<Booleov>("DEBUG"),
prijenosi: lažno,
}),
}),
MongooseModule.forRootAsync({
ubaci: [ConfigService],
useFactory: asinkroni (configService: ConfigService) => ({
uri: configService.get('MONGO_URI')
})
}),
],
kontroleri: [AppController],
pružatelji usluga: [AppService],
})

izvozrazreda AppModule {}

Ovaj modul uvozi GraphQLModul iz @nestjs/graphql i MongooseModule iz @nestjs/mungos koji pomaže u povezivanju s MongoDB-om. The autoSchemaFile svojstvo navodi lokaciju generirane datoteke sheme, a shema sortiranja svojstvo osigurava poredak polja po abecedi.

Evo što je vaš MongoDB konfiguracija datoteka bi trebala izgledati ovako:

uvoz { registerAs } iz'@nestjs/config';

/**
 * Konfiguracija veze Mongo baze podataka
 */
izvozzadano registerAs('mongodb', () => {
konst {
MONGO_URI
} = proces.env;

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

Definiranje GraphQL sheme

Nakon postavljanja GraphQL i MongoDB veza, trebali biste definirati GraphQL upite i mutacije za generiranje sheme (shema.gql) datoteka.

Pisanje upita

u kod-prvi pristup, kreirate model pomoću ObjectType dekorater. Kasnije ćete transformirati ovaj model u tip GraphQL.

Na primjer:

// book.model.ts
uvoz { Field, ObjectType } iz'@nestjs/graphql';
uvoz {Prop, Schema, SchemaFactory} iz'@nestjs/mungos';
uvoz { Dokument } iz'mungos';

izvoztip BookDocument = Knjiga & Dokument;

@ObjectType()
@Shema()
izvozrazreda Knjiga {
@Polje()
titula: niz;

@Polje()
Autor: niz;

@Polje()
Datum objave: Booleov;
}

izvozkonst BookSchema = SchemaFactory.createForClass (Knjiga);

GraphQL prema zadanim postavkama ne može koristiti stvorene sheme. Kako bi bili funkcionalni, potrebna vam je usluga razrješitelja koja sadrži funkcije za izvršavanje tipova GraphQL. To možete učiniti s Razrješivač dekorater.

// books.resolver.ts
uvoz { Razrješavač, upit, mutacija, argumenti, ID } iz'@nestjs/graphql';
uvoz { Knjiga } iz'./book.model';
uvoz { BookService } iz'./books.service';

@Razrješivač(() => Knjiga)
izvozrazreda BookResolver {
konstruktor(privatna readonly bookService: BookService) { }

@Upit(() => [Knjiga])
asinkroni knjige(): Obećanje {
povratakovaj.bookService.findAll();
}

@Upit(() => Knjiga)
asinkroni knjiga(@Args('iskaznica', { tip: () => Učinio sam: niz): Obećanje {
povratakovaj.bookService.findOne (id);
}
}

Možete implementirati BookService, gore uvezeno, kako slijedi:

// books.service.ts
uvoz { Injekcioni } iz'@nestjs/common';
uvoz {InjectModel} iz'@nestjs/mungos';
uvoz { Model } iz'mungos';
uvoz { Knjiga, Knjižni dokument } iz'./book.model';

@Injekcioni()
izvozrazreda BookService {
konstruktor(@InjectModel(Naziv.knjige) privatna bookModel: Model) { }

asinkroni pronađiSve(): Obećanje {
povratakovaj.bookModel.find().exec();
}

asinkroni findOne (id: niz): Obećanje {
povratakovaj.bookModel.findById (id).exec();
}
}

Također trebate dodati BookResolver na popis pružatelja usluga u knjige.modul.ts.

uvoz { Modul } iz"@nestjs/zajedničko";
uvoz { MongooseModule } iz"@nestjs/mungos";
uvoz { BookService } iz'./books.service';
uvoz { BookResolver } iz'./books.resolver';
uvoz { Knjiga, BookSchema } iz'./book.model';

@Modul({
pružatelji usluga: [
BookService,
BookResolver
],
uvozi: [MongooseModule.forFeature([
{
ime: ime.knjige,
shema: BookSchema,
},
]),
],
})

izvozrazreda BooksModule {}

Rad s mutacijama

Dok koristite upit za dohvaćanje podataka u GraphQL, mutacije stvaraju ili ažuriraju podatke u bazi podataka. Za stvaranje mutacija morate prihvatiti podatke od korisnika. The InputType dekorater, koji klasu pretvara u tip unosa GraphQL, ovdje je koristan.

// book.input.ts
uvoz { InputType, Field } iz'@nestjs/graphql';

@InputType()
izvozrazreda BookInput {
@Polje()
titula: niz;

@Polje()
Autor: niz;

@Polje()
Datum objave: Booleov
}

Sada možete ažurirati knjige.razrješavač.ts da izgleda ovako:

uvoz { Razrješavač, upit, mutacija, argumenti, ID } iz'@nestjs/graphql';
uvoz { Knjiga } iz'./book.model';
uvoz { BookService } iz'./books.service';
uvoz { BookInput } iz'./book.input';

@Razrješivač(() => Knjiga)
izvozrazreda BookResolver {
konstruktor(privatna readonly bookService: BookService) { }

@Mutacija(() => Knjiga)
asinkroni stvoritiKnjigu(@Args('ulazni') unos: BookInput): Obećanje {
povratakovaj.bookService.create (unos);
}

@Mutacija(() => Knjiga)
asinkroni ažuriraj knjigu(
@Args('iskaznica', { tip: () => Učinio sam: niz,
@Args('ulazni') unos: BookInput,
): Obećanje {
povratakovaj.bookService.update (id, unos);
}

@Mutacija(() => Knjiga)
asinkroni izbriši knjigu(@Args('iskaznica', { tip: () => Učinio sam: niz): Obećanje {
povratakovaj.bookService.delete (id);
}
}

I knjige.servis.ts kao ovo:

uvoz { Injekcioni } iz'@nestjs/common';
uvoz {InjectModel} iz'@nestjs/mungos';
uvoz { Model } iz'mungos';
uvoz { Knjiga, Knjižni dokument } iz'./book.model';

@Injekcioni()
izvozrazreda BookService {
konstruktor(@InjectModel(Naziv.knjige) privatna bookModel: Model) { }

asinkroni stvoriti (knjiga: knjiga): Obećanje {
konst nova knjiga = noviovaj.bookModel (knjiga);
povratak novaKnjiga.save();
}

asinkroni ažuriranje (id: niz, knjiga: Knjiga): Obećanje {
povratakovaj.bookModel.findByIdAndUpdate (id, knjiga, { novi: pravi }).exec();
}

asinkroniizbrisati(iskaznica: niz): Obećanje {
povratakovaj.bookModel.findByIdAndDelete (id).exec();
}
}

The @Mutacija dekorater označava funkciju kao vrstu mutacije i @Args dekorater hvata sve ulaze proslijeđene u funkciju.

Konačno, trebali biste uvesti BooksModule u AppModule kako bi ga učinili funkcionalnim. Također biste trebali proći BooksModule do zaRootAsync kao što se vidi dolje.

uvoz { BooksModule } iz'./knjige/knjige.modul';
/**
 * ostali uvozi
*/

@Modul({
uvozi: [
ConfigModule.forRoot({
učitaj: [mongodbConfig],
jeGlobalno: pravi
}),
NestGraphQLModule.forRootAsync({
vozač: ApolloDriver,
ubaci: [ConfigService],
useFactory: asinkroni (configService: ConfigService) => ({
autoSchemaFile: pridruži se (process.cwd(), 'src/schema.gql'),
installSubscriptionHandlers: pravi,
shema sortiranja: pravi,
igralište: pravi,
debug: configService.get<Booleov>("DEBUG"),
prijenosi: lažno,
}),
}),
MongooseModule.forRootAsync({
ubaci: [ConfigService],
useFactory: asinkroni (configService: ConfigService) => ({
uri: configService.get('MONGO_URI')
})
}),
BooksModule,
],
kontroleri: [AppController],
pružatelji usluga: [AppService],
})

izvozrazreda AppModule {}

Kôd možete testirati pokretanjem npm pokrenuti početak: dev u vašem terminalu, a vaša bi se aplikacija trebala uspješno pokrenuti na priključku 3000.

Otvoren lokalni host: 3000/graphql u vašem pregledniku za prikaz Graphiql sučelje gdje možete testirati upite i mutacije. Evo primjera koji prikazuje upit:

Evo primjera mutacije:

Izradite učinkovite API-je s NestJS i GraphQL

Izrada GraphQL API-ja u NestJS-u s MongoDB-om pomoću Mongoosea uključuje definiranje sheme za GraphQL API, sheme za Mongoose model, uslugu za interakciju s bazom podataka i razrješivač za mapiranje GraphQL operacija u uslugu metode.

NestJS ima ugrađenu funkcionalnost za izgradnju API-ja, uključujući dekoratere za definiranje ruta, čuvare za njihovu zaštitu i međuprograme za rukovanje zahtjevima i odgovorima. Također podržava druge baze podataka kao što su PostgreSQL, MySQL i SQLite, kao i druge GraphQL biblioteke kao što su Apollo i TypeGraphQL.