GraphQL nudi fleksibilnu alternativu klasičnom REST pristupu kada gradite API.

Jedan od najvažnijih čimbenika koje treba uzeti u obzir pri dizajniranju aplikacije je vrsta API arhitekture koju ćete koristiti. Učinkovit dizajn API-ja ključan je u osiguravanju performansi aplikacija tijekom cijelog životnog ciklusa.

RESTful arhitektura je najpopularniji pristup, ali ima jedan značajan nedostatak: strukturu fiksne krajnje točke koja vraća unaprijed određene podatke. Ovaj dizajn može rezultirati neučinkovitom komunikacijom.

Nasuprot tome, GraphQL—alternativa REST-u—nudi veću fleksibilnost dopuštajući vam da tražite samo podatke koji su vam potrebni.

Što su GraphQL API-ji?

GraphQL je upitni jezik koji možete koristiti za pisanje backend API-ja (Application Programming Interfaces). Za razliku od REST API-ji, koji imaju više krajnjih točaka za različite podatke, GraphQL API-ji imaju samo jednu ulaznu točku.

Klijenti mogu navesti podatke koji su im potrebni u svojim upitima s ove jedinstvene ulazne točke, čineći je fleksibilnijom i učinkovitijom za dohvaćanje samo potrebnih podataka.

instagram viewer

Jednostavno rečeno, GraphQL API implementira GraphQL arhitekturu koju opisuje GraphQL specifikacije. Ovaj dizajn uključuje definiranje sheme, upita i mutacija s kojima klijenti mogu komunicirati.

Ovdje je pojednostavljena raščlamba bitnih komponenti GraphQL API arhitekture:

  1. Shema: shema je opis vrsta podataka i operacija koje pruža API. U osnovi, shema definira strukturu dostupnih podataka i vrstu upita i mutacija koje klijent može izvršiti za izmjenu podataka.
  2. Upiti: Klijenti koriste upite za dohvaćanje podataka iz baze podataka određivanjem strukture podataka koji su im potrebni. Štoviše, mogu ugnijezditi više upita u jedan HTTP zahtjev za dohvaćanje povezanih podataka s više krajnjih točaka.
  3. Mutacije: Mutacije su operacije koje se koriste za modificiranje podataka u bazi podataka. Klijenti mogu slati zahtjeve za mutaciju za stvaranje, ažuriranje ili brisanje podataka.

Postavite MongoDB bazu podataka

Započeti, stvoriti MongoDB bazu podataka. Alternativno, možete besplatno postavite MongoDB klaster u oblaku.Kada postavite svoju bazu podataka, kopirajte MongoDB-ov niz URI veze s bazom podataka.

Kôd ovog projekta možete pronaći u GitHub spremište.

Stvorite Apollo poslužitelj

Apollo poslužitelj je popularna implementacija GraphQL poslužitelja koja će vam omogućiti izradu GraphQL API-ja u JavaScript okruženjima, uključujući Node.js, Express i više.

Napravite imenik za novi projekt i CD u njega:

mkdir graphql-API-mongoDB
cd graphql-API-mongoDB

Zatim inicijalizirajte novi Node.js projekt.

npm init --da

Ova naredba stvara a paket.json datoteka.

Instalirajte potrebne ovisnosti

Pokrenite sljedeću naredbu za instalaciju paketa.

npm instalirajte apollo-poslužitelj graphql mongoose

Na kraju, stvorite index.js datoteku u korijenskom direktoriju vašeg projekta.

Postavite Apollo poslužitelj

Otvoren index.js i dodajte kod ispod:

konst {ApolloServer} = zahtijevati('apollo-poslužitelj');
konst mungos = zahtijevati('mungos');
konst typeDefs = zahtijevati("./graphql/typeDefs");
konst razrješivači = zahtijevati("./graphql/resolvers");

konst poslužitelj = novi ApolloServer({
typeDefs,
razrješivači
});

konst MONGO_URI = 'mongodb://localhost: 27017';

mungos
.connect (MONGO_URI, {
useNewUrlParser: pravi,
useUnifiedTopology: pravi,
})
.zatim(() => {
konzola.log(`Db povezan`);
povratak server.listen({ luka: 5000 });
})
.zatim((res) => {
konzola.log(`Poslužitelj radi na ${res.url}`);
})
.ulov(pogriješiti => {
konzola.log (poruka o pogrešci);
});

Ovaj kod inicijalizira lokalni GraphQL poslužitelj pomoću biblioteke Apollo Servera. Zatim uspostavlja vezu s MongoDB bazom podataka s danim URI-jem veze.

Primijetite kako kôd prosljeđuje dva argumenta novoj instanci ApolloServera: typeDefs i resolvers. Oni određuju vrste podataka i operacije koje GraphQL API može izvršiti.

Nakon što je veza s MongoDB bazom podataka postavljena, poslužitelj počinje osluškivati ​​na portu 5000.

Definirajte podatkovni model

Napravite novu mapu u korijenskom direktoriju mape vašeg projekta i dajte joj naziv modeli. U ovoj mapi stvorite nove nazive datoteka dataModel.js i dodajte mu sljedeći kod:

konst {model, shema} = zahtijevati('mungos');

konst shema zaposlenika = novi Shema({
Ime: Niz,
odjel: Niz,
plaća: Niz,
});

modul.izvoz = model('Zaposlenik', Shema zaposlenika);

Definirajte GraphQL shemu

GraphQL shema definira strukturu podataka za koje možete postavljati upite pomoću GraphQL API-ja. Shema također ocrtava upite i mutacije koje API može pokrenuti. Možete koristiti upite za dohvaćanje podataka i mutacije za njihovu izmjenu.

U korijenskom direktoriju vašeg projekta stvorite novu mapu i dajte joj naziv graphql. Unutar ove mape dodajte dvije datoteke: typeDefs.js i razrješivači.js

Dodajte kod u nastavku u datoteku typeDefs.js:

konst {gql} = zahtijevati("apollo-poslužitelj");

konst typeDefs = gql`
upišite Zaposlenik {
učinio sam!
Ime: Niz
odjel: Niz
plaća: Niz
}
unos EmployeeInput {
Ime: Niz
odjel: Niz
plaća: Niz
}
upišite upit {
getEmployee (id: ID): broj zaposlenikapovratak Zaposlenik po ID
zaposlenici: [zaposlenik] #povratak niz od Zaposlenici
}
tip Mutacija {
createEmployee (employeeInput: EmployeeInput): Zaposlenik
updateEmployee (id: ID, zaposlenikInput: Unos zaposlenika): Booleov
deleteEmployee (id: ID): Booleov
}
`;

modul.exports = typeDefs;

Ovaj kod iznad koristi gql funkcija koju pruža paket apollo-poslužitelja za stvaranje GraphQL sheme za podatke zaposlenika.

Shema se sastoji od četiri glavna elementa: tipovi podataka za informacije o zaposlenicima, tipovi unosa, upiti i mutacije koje API može izvesti.

Definirajte razlučivače za GraphQL API

Razrešivač je GraphQL funkcija koja definira podatke koji se prosljeđuju kada klijent pošalje API upit za dohvaćanje podataka. U biti, njegova primarna uloga je dohvatiti tražene podatke iz navedenog izvora podataka i vratiti ih klijentu.

Dodajte donji kod u razrješivači.js datoteka u graphql mapa. Razrešivači su u ovom slučaju specificirani unutar objekata Query i Mutation.

Objekt Query definira dvije metode: zaposlenici i getEmployee. Ove su metode odgovorne za dohvaćanje podataka o zaposlenicima iz baze podataka na zahtjev klijenta.

konst Zaposlenik= zahtijevati("../modeli/employeesModel");

// GraphQL razlučivači
konst razrješivači = {
Upit: {
zaposlenici: asinkroni () => {
probati {
konst zaposlenici = čekati Employee.find({});
povratak zaposlenici;
} ulov (pogreška) {
konzola.greška (greška);
bacanjenoviGreška('Nije uspjelo dohvaćanje zaposlenika');
}
},
getEmployee: asinkroni (roditelj, argumenti) => {
probati {
konst zaposlenik = čekati Employee.findById (args.id);
povratak zaposlenik;
} ulov (pogreška) {
konzola.greška (greška);
bacanjenoviGreška('Nije uspjelo dohvaćanje zaposlenika po ID-u');
}
},
},

Objekt Mutation ima tri metode: createEmployee, ažurirajZaposlenik, i izbrisati Zaposlenika. Ove metode mijenjaju podatke pohranjene u MongoDB bazi podataka.

 Mutacija: {
asinkroni createEmployee (_, { zaposlenikInput: { ime, odjel, plaća } }) {
konst novi zaposlenik = novi Zaposlenik({
ime: ime,
odjel: odjel,
plaća: plaća
});

konst odgovor = čekati newEmployee.save();
konzola.log (noviZaposlenik);

povratak {
id: odgovor._id,
...odgovor._doc
}
},

asinkroni updateEmployee (_, {id, zaposlenikInput: {ime, odjel, plaća}}) {
konst ažuriraniZaposlenik = čekati Employee.updateOne(
{ _iskaznica: iskaznica },
{ ime, odjel, plaća }
);

ako (!updatedEmployee) {
bacanjenoviGreška(`Zaposlenik s iskaznicom: ${id} nije pronađeno`);
}

povratakpravi; // Vrati Booleovu vrijednost koja ukazuje na uspjeh ažuriranja
},

asinkroni deleteEmployee (_, {id}) {
konst izbrisani zaposlenik = čekati Employee.deleteOne({ _iskaznica: iskaznica });

ako (!deletedEmployee || deletedEmployee.deletedCount 0) {
bacanjenoviGreška(`Zaposlenik s iskaznicom ${id} nije pronađeno`);
}

povratakpravi; // Vrati Booleovu vrijednost koja pokazuje uspjeh brisanja
},
 },
};

modul.exports = razrješivači;

Na kraju, pokrenite ovu naredbu da zavrtite poslužitelj:

indeks čvora.js

Nakon što uspostavi vezu s bazom podataka, poslužitelj će se pokrenuti na portu 5000.

Možete nastaviti i testirati funkcionalnost GraphQL API-ja postavljanjem HTTP zahtjeva s igrališta GraphQL u svom pregledniku.

Na primjer, možete koristiti createEmployee mutacija za dodavanje novih podataka o zaposlenicima u MongoDB bazu podataka.

Popularnost GraphQL-a u zajednici programera

GraphQL postaje sve popularniji u zajednici programera kao alternativni API dizajn pristup popularnoj REST arhitekturi.

To je zbog njegove sposobnosti da pruži fleksibilniji i učinkovitiji način za dohvaćanje podataka iz različitih izvora, sve s jedne ulazne točke. Time se izbjegava upravljanje višestrukim krajnjim točkama za različite podatke, što je čest problem s REST API arhitekturom. Ovo dizajnersko rješenje pojednostavljuje proces izgradnje i upravljanja pozadinskim API-jima.