GraphQL/MongoDB API implementeren met Netlify Functies
Pawel Rybczynski
Software Engineer
Doelen Eerste installatie Dependencies installeren Laten we beginnen Voeg eerst tsconfig.json toe aan de hoofddirectory: Laten we nu src/server.ts maken voor serverimplementaties. Voeg dan twee functies toe: een voor de lokale server en een voor de lambda. OK, we hebben geen resolvers of type definities dus we moeten er een paar maken. Laten we aannemen dat we in eerste instantie [...]
Doelen
Configureer zowel lokale als lambda-servers.
Verbind beide met MongoDB.
Basisauthenticatie implementeren.
Serverloze Apollo implementeren GraphQL API met Netlify.
OK, we hebben geen resolvers of typedefinities dus we moeten er een paar maken. Laten we aannemen dat we eerst gebruikers willen aanmaken en informatie over hen willen ontvangen.
Maar we hebben geen gegevens... Laten we het oplossen 😉
Vergeet niet om de typedefinitie en resolver te importeren op de server.
// src/server.ts
import { ApolloServer as ApolloServerLambda } from "apollo-server-lambda";
import { ApolloServer } from "apollo-server";
import { typeDefs } from "./schemas";
import { resolvers } from "./resolvers";
{...}
Verbinding maken met MongoDB via mongoose
Nu is het een goed moment om een verbinding te maken met onze database. In dit specifieke geval zal dat MongoDB zijn. Het is gratis en gemakkelijk te onderhouden. Maar laten we eerst nog twee afhankelijkheden installeren:
npm install --save mongoose dotenv
De eerste stap is het maken van een gebruikersmodel.
Veiligheid eerst! Laten we nu onze wachtwoorden beveiligen door ze te hashen.
npm install --save bcrypt @types/bcrypt
Implementeer nu de wachtwoordbeveiliging in de pre-middleware callback. Pre-middleware functies worden na elkaar uitgevoerd, wanneer elke middleware de volgende aanroept. Om de wachtwoorden veilig te maken, gebruiken we een techniek die een salt en hash genereert bij afzonderlijke functie-aanroepen.
// src/model.ts
importeer bcrypt van "bcrypt";
{...}
const SALT_WORK_FACTOR: getal = 10;
GebruikersSchema.pre("opslaan", functie (volgende) {
const user = this as User;
if (!this.isModified("password")) return next();
bcrypt.genSalt(SALT_WORK_FACTOR, functie (err, salt) {
if (err) return next(err);
bcrypt.hash(user.password, salt, functie (err, hash) {
if (err) return next(err);
user.password = hash;
next();
});
});
});
{...}
Voeg dan de methode ComparePasswords toe aan UserSchema:
Nu kunnen we een verbinding regelen tussen servers en databases. MONGODB_URI is een omgevingsvariabele die een verbindingstekenreeks bevat die nodig is om de verbinding te maken. Je kunt deze uit je clusterpaneel halen nadat je bent ingelogd op je MongoDB atlas account. Zet het in .env
// .env
MONGODB_URI = ...;
Vergeet niet om dat bestand altijd toe te voegen aan .gitignore. Geweldig! Laten we nu een functie toevoegen waarmee we verbinding kunnen maken met db.
De context is een object dat wordt gedeeld door alle resolvers. Om het aan te bieden, hoeven we alleen maar een context initialisatiefunctie toe te voegen aan de ApolloServer constructor. Laten we dat doen.
Je zou dergelijke informatie in de terminal moeten krijgen:
Server ir draait op http://localhost:4000/
Zo ja, open dan de http://localhost:4000/ in uw browser.
De GraphQL speeltuin zou moeten verschijnen. Laten we een nieuwe gebruiker aanmaken!
Kijk eens hoe het eruit ziet in de database.
Gaaf! Alles werkt prima!
Laten we proberen wat gebruikersinformatie te krijgen.
En het wachtwoordveld toevoegen...
Leuk! We ontvangen foutmelding Kan veld "wachtwoord" niet bevragen op type "Gebruiker".". Zoals je kunt zien, hebben we dit veld niet toegevoegd aan de definitie van het gebruikerstype. Het is er met opzet. We moeten het niet mogelijk maken om een wachtwoord of andere gevoelige gegevens op te vragen.
Nog iets... We kunnen gebruikersgegevens krijgen zonder authenticatie... het is geen goede oplossing. We moeten dit oplossen.
Maar voordat...
Codegen configureren
Laten we GraphQL gebruiken code generator om een compatibel basistype te krijgen, gebaseerd op ons schema.
Maak checkAuth functie om te controleren of het token geldig is. We voegen het resultaat toe aan de context zodat we er toegang toe hebben in de resolvers.