GraphQL/MongoDB API diegimas naudojant "Netlify" funkcijas
Pawel Rybczynski
Software Engineer
Tikslai Pradinė sąranka Įdiegti priklausomybes Pradėkime Pirmiausia į pagrindinį katalogą pridėkite tsconfig.json: Dabar sukurkime src/server.ts, skirtą serverių įgyvendinimui. Tada pridėkite dvi funkcijas: vieną vietiniam serveriui, o kitą - lambda. Gerai, neturime jokių resolverių ar tipų apibrėžčių, todėl turime jas sukurti. Tarkime, kad iš pradžių norime [...]
Tikslai
Sukonfigūruokite vietinį ir "lambda" serverius.
Prijunkite abi prie "MongoDB".
Įgyvendinkite pagrindinį autentifikavimą.
Įdiegti be serverio veikiantį "Apollo GraphQLAPI su "Netlify".
Gerai, neturime jokių skirstytuvų ar tipų apibrėžčių, todėl turime jas sukurti. Tarkime, kad iš pradžių norime kurti naudotojus ir gauti apie juos informaciją.
Nepamirškite į serverį importuoti tipo apibrėžtį ir skirstytuvą.
// src/server.ts
import { ApolloServer as ApolloServerLambda } from "apollo-server-lambda";
importuoti { ApolloServer } iš "apollo-server";
importuoti { typeDefs } iš "./schemas";
importuoti { resolvers } iš "./resolvers";
{...}
Prisijungimas prie "MongoDB" per "mongoose
Dabar pats laikas sukurti ryšį su mūsų duomenų baze. Šiuo konkrečiu atveju tai bus MongoDB. Tai nemokama ir lengvai prižiūrima duomenų bazė. Tačiau prieš tai įdiekime dar dvi priklausomybes:
Pirmiausia saugumas! Dabar apsaugokime savo slaptažodžius juos šifruodami.
npm install --save bcrypt @types/bcrypt
Dabar įgyvendinkite slaptažodžio apsaugą išankstinio tarpinės programinės įrangos grįžtamojo skambučio viduje. Pre-middleware funkcijos vykdomos viena po kitos, kai kiekviena tarpinė programinė įranga skambina toliau. Kad slaptažodžiai būtų saugūs, naudojame metodą, kuris generuoja druską ir hash atskirais funkcijų iškvietimais.
// src/model.ts
import bcrypt from "bcrypt";
{...}
const SALT_WORK_FACTOR: number = 10;
UserSchema.pre("save", function (next) {
const user = this as User;
if (!this.isModified("password")) return next();
bcrypt.genSalt(SALT_WORK_FACTOR, function (err, salt) {
if (err) return next(err);
bcrypt.hash(user.password, salt, function (err, hash) {
if (err) return next(err);
user.password = hash;
next();
});
});
});
{...}
Tada į UserSchema pridėkite metodą comparePasswords:
// src/model.ts
{...}
UserSchema.methods.comparePasswords = funkcija (
candidatePassword: string,
cb: (err: Error | null, same: boolean | null) => void
) {
const user = this as User;
bcrypt.compare(candidatePassword, user.password, (err, isMatch) => {
if (err) {
return cb(err, null);
}
cb(null, isMatch);
});
};
{...}
Dabar galime užmegzti ryšį tarp serverių ir duomenų bazių. MONGODB_URI yra aplinkos kintamasis, kuriame pateikiama ryšio eilutė, reikalinga ryšiui sukurti. Ją galite gauti iš klasterio skydelio, prisijungę prie "MongoDB atlas" paskyros. Įdėkite jį į .env
// .env
MONGODB_URI = ....;
Visada nepamirškite pridėti šio failo prie .gitignore. Puiku! Dabar pridėkime funkciją, kuri leistų prisijungti prie db.
Kontekstas yra objektas, kuris yra bendras visiems skirstytuvams. Kad jį suteiktume, mums tereikia į ApolloServer konstruktorių įtraukti konteksto inicializavimo funkciją. Padarykime tai.
Tokią informaciją turėtumėte gauti terminalo viduje:
Serveris ir veikia adresu http://localhost:4000/
Jei taip, atidarykite http://localhost:4000/ naršyklėje.
Turėtų pasirodyti GraphQL žaidimų aikštelė. Sukurkime naują naudotoją!
Pažvelkite, kaip tai atrodo duomenų bazėje.
Šaunu! Viskas veikia puikiai!
Pabandykime gauti naudotojo informacijos.
Ir pridėkite slaptažodžio lauką...
Puiku! Mes gauname klaidą Negalima užklausti lauko "password" tipo "User".". Kaip galite patikrinti atgal, šio lauko nepridėjome naudotojo tipo apibrėžtyje. Jis ten yra specialiai. Neturėtume sudaryti galimybės užklausti bet kokį slaptažodį ar kitą slaptą duomenys.
Kitas dalykas... Galime gauti naudotojo duomenis be jokio autentifikavimo... tai nėra geras sprendimas. Turime tai ištaisyti.
Bet prieš tai...
Konfigūruoti "Codegen
Naudokime GraphQL kodas generatorių, kad gautumėte suderinamą bazinį tipą pagal mūsų schemą.
Sukurti checkAuth funkcija, skirta patikrinti, ar simbolis yra galiojantis. Rezultatą pridėsime prie konteksto, kad galėtume jį pasiekti per sprendiklius.
Pabandykime dar kartą gauti naudotoją, bet šį kartą į antraštes pridėjus simbolį
Šaunu! O kas, jei nustatysime neteisingus įgaliojimus?
Puiku!
Pasirengimas diegti
Paskutinis žingsnis: dislokuokite serverless api su Netlify!
Sukurti aplanką lambda pagrindiniame dir ir įdėkite du failus:
Pirmajame yra AWS tvarkytojas. Ji sukuria "ApolloServerLambda" serverio egzempliorių ir tada atskleiskite tvarkyklę naudodami to egzemplioriaus createHandler.