GraphQL/MongoDB API:n käyttöönotto Netlify Functionsin avulla
Pawel Rybczynski
Software Engineer
Tavoitteet Alkuasetukset Riippuvuuksien asentaminen Aloitetaan Aluksi lisätään tsconfig.json päähakemistoon: Nyt luodaan src/server.ts palvelintoteutuksia varten. Lisää sitten kaksi funktiota: toinen paikalliselle palvelimelle ja toinen lambdalle. OK, meillä ei ole resolvereita tai tyyppimäärityksiä, joten meidän on luotava niitä. Oletetaan, että aluksi haluamme [...]
Tavoitteet
Määritä sekä paikalliset että lambda-palvelimet.
Yhdistä molemmat MongoDB:hen.
Ota käyttöön perustodennus.
Ota palvelimetön Apollo käyttöön GraphQL API Netlifyn kanssa.
OK, meillä ei ole resolvereita tai tyyppimäärityksiä, joten meidän on luotava niitä. Oletetaan, että aluksi haluamme luoda käyttäjiä ja vastaanottaa tietoja heistä.
Mutta meillä ei ole mitään tietoja... Korjataan se 😉.
Älä unohda tuoda tyyppimäärittelyä ja resolveria palvelimelle.
// src/server.ts
import { ApolloServer as ApolloServerLambda } from "apollo-server-lambda";
import { ApolloServer } from "apollo-server";
import { typeDefs } from "./schemas";
import { resolvers } from "./resolvers";
{...}
Yhteys MongoDB:hen mongoose:n kautta
Nyt on hyvä aika luoda yhteys tietokantaan. Tässä tapauksessa se on MongoDB. Se on ilmainen ja helppo ylläpitää. Mutta ennen sitä asennetaan vielä kaksi riippuvuutta:
Turvallisuus ensin! Suojaamme nyt salasanamme hashtaamalla ne.
npm install --save bcrypt @types/bcrypt
Toteuta nyt salasanaturvallisuus pre-middleware-kutsun takaisinkutsun sisällä. Pre-middleware-funktiot suoritetaan peräkkäin, kun kukin middleware kutsuu seuraavaa. Jotta salasanat olisivat turvallisia, käytämme tekniikkaa, joka luo suolan ja hashin erillisillä funktiokutsuilla.
// 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();
});
});
});
{...}
Lisää sitten comparePasswords-menetelmä UserSchemaan:
// src/model.ts
{...}
UserSchema.methods.comparePasswords = function (
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);
});
};
{...}
Nyt voimme järjestää yhteyden palvelimien ja tietokantojen välille. MONGODB_URI on ympäristömuuttuja, joka sisältää yhteyden luomiseen tarvittavan merkkijonon. Saat sen klusteripaneelistasi, kun olet kirjautunut MongoDB-atlas-tilillesi. Laita se sisään .env
// .env
MONGODB_URI = ....;
Muista aina lisätä kyseinen tiedosto .gitignore. Hienoa! Nyt lisätään funktio, joka mahdollistaa yhteyden muodostamisen db:hen.
Konteksti on objekti, joka on yhteinen kaikille resolvereille. Sen tarjoamiseksi meidän tarvitsee vain lisätä kontekstin alustustoiminto ApolloServer-konstruktoriin. Tehdään se.
Sinun pitäisi saada nämä tiedot terminaalin sisältä:
Palvelin ir toimii osoitteessa http://localhost:4000/
Jos kyllä, avaa http://localhost:4000/ selaimesi sisällä.
GraphQL-leikkikentän pitäisi näkyä. Luodaan uusi käyttäjä!
Katso, miltä se näyttää tietokannassa.
Siistiä! Kaikki toimii hienosti!
Yritetään saada käyttäjätietoja.
Ja lisää salasanakenttä...
Hienoa! Saamme virheen Kenttää "salasana" ei voida kysyä tyypiltä "Käyttäjä".". Kuten voit tarkistaa, emme lisänneet tätä kenttää käyttäjätyypin määritelmän sisään. Se on siellä tarkoituksella. Meidän ei pitäisi mahdollistaa salasanan tai muiden arkaluonteisten tietojen kyselyä.
Toinen asia... Voimme saada käyttäjätietoja ilman todennusta... se ei ole hyvä ratkaisu. Meidän on korjattava se.
Mutta ennen kuin...
Codegenin määrittäminen
Käytetään GraphQL koodi generaattorilla saadaksemme yhteensopivan perustyypin, joka perustuu skeemaamme.
Yritetään saada käyttäjä uudelleen, mutta tällä kertaa otsikoihin on lisätty tunniste.
Siistiä! Entä jos asetamme väärät tunnukset?
Hienoa!
Valmistele käyttöönotto
Viimeinen vaihe: ota palvelimetön api käyttöön Netlifyllä!
Luo kansio lambda päähakemistoon ja laita kaksi tiedostoa sen sisälle:
Ensimmäinen sisältää AWS-käsittelijän. Se luo ApolloServerLambda-palveluinstanssin ja ja aseta sitten käsittelijä näkyviin käyttämällä kyseisen instanssin createHandler-ohjelmaa.