GraphQL pakub API loomisel paindlikku alternatiivi klassikalisele REST-lähenemisele.

Üks olulisemaid tegureid, mida rakenduse kujundamisel arvestada, on kasutatava API arhitektuuri tüüp. Tõhus API disain on ülioluline, et tagada rakenduste toimivus kogu nende elutsükli jooksul.

RESTful arhitektuur on kõige populaarsem lähenemisviis, kuid sellel on üks oluline puudus: fikseeritud lõpp-punkti struktuur, mis tagastab etteantud andmed. See disain võib põhjustada ebatõhusa suhtluse.

Seevastu GraphQL – alternatiiv REST-ile – pakub suuremat paindlikkust, võimaldades teil taotleda ainult vajalikke andmeid.

Mis on GraphQL API-d?

GraphQL on päringukeel, mida saate kasutada taustarakendusliideste (Application Programming Interface) kirjutamiseks. Erinevalt REST API-d, millel on erinevate andmete jaoks mitu lõpp-punkti, on GraphQL API-del ainult üks sisenemispunkt.

Kliendid saavad sellest ühest sisestuspunktist määrata oma päringutes vajalikud andmed, muutes selle paindlikumaks ja tõhusamaks ainult vajalike andmete hankimiseks.

instagram viewer

Lihtsamalt öeldes rakendab GraphQL API GraphQL arhitektuuri, mida kirjeldab GraphQL spetsifikatsioonid. See disain hõlmab skeemi, päringute ja mutatsioonide määratlemist, millega kliendid saavad suhelda.

Siin on GraphQL API arhitektuuri oluliste komponentide lihtsustatud jaotus:

  1. Skeem: skeem on API pakutavate andmete ja toimingute tüüpide kirjeldus. Põhimõtteliselt määratleb skeem saadaolevate andmete struktuuri ning päringute ja mutatsioonide tüübi, mida klient saab andmete muutmiseks täita.
  2. Päringud: kliendid kasutavad päringuid andmete toomiseks andmebaasist, täpsustades neile vajalike andmete struktuuri. Lisaks saavad nad ühte HTTP-päringusse pesastada mitu päringut, et tuua seotud andmeid mitmest lõpp-punktist.
  3. Mutatsioonid: mutatsioonid on toimingud, mida kasutatakse andmebaasis olevate andmete muutmiseks. Kliendid saavad andmete loomiseks, värskendamiseks või kustutamiseks saata mutatsioonitaotlusi.

MongoDB andmebaasi seadistamine

Alustamiseks looge MongoDB andmebaas. Teise võimalusena saate looge MongoDB klaster pilves tasuta.Kui olete andmebaasi seadistanud, kopeerige MongoDB andmebaasiühenduse URI string.

Selle projekti koodi leiate sellest GitHubi hoidla.

Looge Apollo server

Apollo server on populaarne GraphQL-i serverirakendus, mis võimaldab teil luua GraphQL API-sid JavaScripti keskkondades, sealhulgas Node.js, Express ja palju muud.

Looge uue projekti jaoks kataloog ja cd sellesse:

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

Järgmisena lähtestage uus Node.js projekt.

npm init -- jah

See käsk loob a package.json faili.

Installige nõutavad sõltuvused

Käivitage pakettide installimiseks järgmine käsk.

npm install apollo-server graphql mongoose

Lõpuks looge an index.js faili oma projekti juurkataloogis.

Seadistage Apollo server

Avatud index.js ja lisage allolev kood:

konst { ApolloServer } = nõuda('apollo-server');
konst mangust = nõuda("mongoose");
konst typeDefs = nõuda("./graphql/typeDefs");
konst lahendajad = nõuda("./graphql/resolvers");

konst server = uus ApolloServer({
typeDefs,
lahendajad
});

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

mangust
.connect (MONGO_URI, {
useNewUrlParser: tõsi,
UseUnifiedTopology: tõsi,
})
.hen(() => {
konsool.log("Db ühendatud".);
tagasi server.listen({ sadamasse: 5000 });
})
.hen((res) => {
konsool.log(`Server töötab kell ${res.url}`);
})
.catch(eks => {
konsool.log (err.message);
});

See kood initsialiseerib kohaliku GraphQL-serveri, kasutades Apollo Serveri teeki. Seejärel loob see antud ühenduse URI-ga ühenduse MongoDB andmebaasiga.

Pange tähele, kuidas kood edastab ApolloServeri uuele eksemplarile kaks argumenti: typeDefs ja lahendajad. Need määravad andmetüübid ja toimingud, mida GraphQL API saab täita.

Pärast ühenduse loomist MongoDB andmebaasiga hakkab server kuulama porti 5000.

Määratlege andmemudel

Looge oma projekti kausta juurkataloogis uus kaust ja nimetage see mudelid. Looge selles kaustas uued failinimed dataModel.js ja lisage sellele järgmine kood:

konst {mudel, skeem} = nõuda("mongoose");

konst töötajaskeem = uus Skeem({
nimi: String,
osakond: String,
palk: String,
});

moodul.exports = model("Töötaja", töötajaSkeemi);

Määratlege GraphQL-i skeem

GraphQL-i skeem määratleb andmete struktuuri, mida saate GraphQL API abil päringuid teha. Skeem kirjeldab ka päringuid ja mutatsioone, mida API saab käitada. Saate kasutada päringuid andmete toomiseks ja mutatsioone nende muutmiseks.

Looge oma projekti juurkataloogis uus kaust ja nimetage see graphql. Lisage sellesse kausta kaks faili: typeDefs.js ja solvers.js

Lisage faili typeDefs.js allolev kood:

konst {gql} = nõuda("apollo-server");

konst typeDefs = gql`
tüüp Töötaja {
ma tegin!
nimi: String
osakond: String
palk: String
}
input EmployeeInput {
nimi: String
osakond: String
palk: String
}
tippige päring {
getEmployee (id: ID): töötaja nrtagasi Töötaja id
töötajad: [töötaja] #tagasi massiivi kohta Töötajad
}
tüüp mutatsioon {
createEmployee (employeeInput: EmployeeInput): Töötaja
updateEmployee (id: ID, töötaja sisend: Töötaja sisend): Boolean
kustuta töötaja (id: ID): Boolean
}
`;

moodul.exports = typeDefs;

See ülaltoodud kood kasutab gql funktsioon, mida pakub pakett apollo-server, et luua GraphQL-i skeemi töötaja andmete jaoks.

Skeem koosneb neljast põhielemendist: töötajate teabe andmetüübid, sisendtüübid, päringud ja mutatsioonid, mida API saab teha.

Määratlege GraphQL API lahendused

Lahendaja on GraphQL-i funktsioon, mis määratleb andmed, mis edastatakse, kui klient saadab andmete toomiseks API päringu. Põhimõtteliselt on selle peamine ülesanne hankida vajalikud andmed määratud andmeallikast ja tagastada need kliendile.

Lisage allolev kood solvers.js faili graphql kausta. Sel juhul on lahendajad määratud päringu ja mutatsiooni objektides.

Päringuobjekt määratleb kaks meetodit: töötajad ja saadaTöötaja. Need meetodid vastutavad töötajate andmete toomise eest andmebaasist kliendi nõudmisel.

konst Töötaja = nõuda("../models/employeesModel");

// GraphQL-i lahendajad
konst lahendajad = {
Päring: {
töötajad: asünkr () => {
proovi {
konst töötajad = ootama Töötaja.leida({});
tagasi töötajad;
} püüda (viga) {
konsool.error (viga);
viskamauusViga("Töötajate toomine ebaõnnestus");
}
},
getEmployee: asünkr (vanem, args) => {
proovi {
konst töötaja = ootama Employee.findById (args.id);
tagasi töötaja;
} püüda (viga) {
konsool.error (viga);
viskamauusViga("Töötaja toomine isikutunnistuse alusel ebaõnnestus");
}
},
},

Mutatsiooniobjektil on kolm meetodit: loo töötaja, updateTöötajaja kustuta töötaja. Need meetodid muudavad MongoDB andmebaasi salvestatud andmeid.

 Mutatsioon: {
asünkr createEmployee (_, { töötaja sisend: { nimi, osakond, palk } }) {
konst uusTöötaja = uus Töötaja({
nimi: nimi,
osakond: osakond,
palk: palk
});

konst vastus = ootama uusTöötaja.save();
konsool.log (uusTöötaja);

tagasi {
id: vastus._id,
...vastus._doc
}
},

asünkr updateEmployee (_, {id, töötaja sisend: {nimi, osakond, palk}}) {
konst uuendatudTöötaja = ootama Employee.updateOne(
{ _id: id },
{ nimi, osakond, palk }
);

kui (!updatedEmployee) {
viskamauusViga(`Töötaja ID-ga: ${id} ei leitud`);
}

tagasitõsi; // Tagastab tõeväärtuse, mis näitab värskenduse õnnestumist
},

asünkr deleteEmployee (_, {id}) {
konst kustutatudTöötaja = ootama Employee.deleteOne({ _id: id });

kui (!deletedEmployee || deletedEmployee.deletedCount 0) {
viskamauusViga(`Töötaja ID-ga ${id} ei leitud`);
}

tagasitõsi; // Tagastab tõeväärtuse, mis näitab kustutamise õnnestumist
},
 },
};

moodul.exports = lahendajad;

Lõpuks käivitage see käsk serveri käivitamiseks:

sõlme indeks.js

Kui see on loonud andmebaasiühenduse, käivitub server pordist 5000.

Saate jätkata ja testida GraphQL API funktsionaalsust, esitades oma brauseris HTTP-päringuid GraphQL-i mänguväljakult.

Näiteks võite kasutada loo töötaja mutatsioon, et lisada MongoDB andmebaasi uusi töötaja andmeid.

GraphQL-i populaarsus arendajate kogukonnas

GraphQL on arendajate kogukonnas populaarseks saanud alternatiivse API disaini lähenemisviisina populaarsele REST-arhitektuurile.

See on tingitud selle võimest pakkuda paindlikumat ja tõhusamat viisi andmete hankimiseks erinevatest allikatest, kõik ühest sisestuspunktist. See väldib vajadust hallata erinevate andmete jaoks mitut lõpp-punkti, mis on REST API arhitektuuri puhul tavaline probleem. See disainilahendus lihtsustab taustarakendusliideste loomise ja haldamise protsessi.