GraphQL/MongoDB API kasutuselevõtt Netlify funktsioonide abil
Pawel Rybczynski
Software Engineer
Eesmärgid Esialgne häälestamine Paigaldame sõltuvused Alustame Kõigepealt lisame tsconfig.json põhikataloogi: Nüüd loome src/server.ts serverite rakenduste jaoks. Seejärel lisame kaks funktsiooni: üks kohaliku serveri jaoks ja teine lambda jaoks. OK, meil ei ole ühtegi resolverit ega tüübimääratlust, seega peame looma mõned. Oletame, et alguses tahame [...]
Eesmärgid
Konfigureerige nii kohalikke kui ka lambda-servereid.
Ühendage mõlemad MongoDB-ga.
Rakendage põhiline autentimine.
Serverless Apollo kasutuselevõtt GraphQL API koos Netlify'ga.
Nüüd loome src/server.ts serverite rakendamiseks. Seejärel lisage kaks funktsiooni: üks kohaliku serveri jaoks ja teine lambda jaoks.
// src/server.ts
import { ApolloServer as ApolloServerLambda } from "apollo-server-lambda";
import { ApolloServer } from "apollo-server";
const createLambdaServer = () =>
new ApolloServerLambda({
typeDefs,
resolvers,
introspection: true,
playground: true,
},
});
const createLocalServer = () =>
new ApolloServer({
typeDefs,
resolvers,
introspection: true,
playground: true,
},
});
eksport { createLambdaServer, createLocalServer };
OK, meil ei ole ühtegi resolverit ega tüübimääratlust, nii et me peame need looma. Oletame, et kõigepealt tahame luua kasutajaid ja saada nende kohta infot.
Ärge unustage importida tüübimääratlust ja resolverit serverisse.
// src/server.ts
import { ApolloServer as ApolloServerLambda } from "apollo-server-lambda";
import { ApolloServer } from "apollo-server";
import { typeDefs } from "./schemas";
import { resolvers } from "./resolvers";
{...}
MongoDB-ga ühendamine mongoose kaudu
Nüüd on hea aeg luua ühendus meie andmebaasiga. Antud juhul on selleks MongoDB. See on tasuta ja seda on lihtne hooldada. Aga enne seda paigaldame veel kaks sõltuvust:
Esmalt turvalisus! Turvalistame nüüd oma paroole hashinguga.
npm install --save bcrypt @types/bcrypt
Nüüd rakendage paroolide turvalisus vahenduseelses tagasikutses. Pre-middleware funktsioonid täidetakse üksteise järel, kui iga middleware kutsub järgmist. Selleks, et paroolid oleksid turvalised, kasutame tehnikat, mis genereerib soola ja hashi eraldi funktsioonikõnedel.
// 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();
});
});
});
{...}
Seejärel lisage meetod comparePasswords meetodile UserSchema:
// 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);
});
};
{...}
Ja muidugi, modifitseeri kasutaja tüüpi.
type comparePasswordFunction = (
kandidaatPassword: string,
cb: (err: Error, isMatch: boolean) => void
) => void;
eksport type User = Document & {
_id: string,
email: string,
name: string,
password: string,
comparePasswords: comparePasswordFunction,
};
Nüüd saame korraldada ühenduse serverite ja andmebaaside vahel. MONGODB_URI on keskkonnamuutuja, mis sisaldab ühenduse loomiseks vajalikku ühendusstringi. Saate selle oma klastri paneelilt pärast MongoDB atlas kontole sisselogimist. Pange see sisse .env
// .env
MONGODB_URI = ...;
Ärge unustage alati, et lisada see fail .gitignore. Suurepärane! Nüüd lisame funktsiooni, mis võimaldab ühendada db.
Kontekst on objekt, mida jagavad kõik lahendajad. Selle pakkumiseks tuleb lihtsalt lisada ApolloServeri konstruktorisse konteksti initsialiseerimisfunktsioon. Teeme seda.
// src/index.ts
import { createLocalServer } from "./server";
require("dotenv").config();
const port = process.env.PORT || 4000;
const server = createLocalServer();
server.listen(port).then(({ url }) => {
console.log(`Server ir töötab aadressil ${url}`);
});
Kui jah, siis avage http://localhost:4000/ teie brauseris.
GraphQLi mänguväljak peaks ilmuma. Loome uue kasutaja!
Vaadake, kuidas see andmebaasis välja näeb.
Lahe! Kõik toimib hästi!
Proovime saada infot kasutajate kohta.
Ja lisage salasõna väli...
Tore! Me saame vea Välja "parool" ei saa päringusse sisestada väljal "User".". Nagu te võite tagasi vaadata, ei lisanud me seda välja kasutajatüübi määratluse sees. See on seal meelega olemas. Me ei peaks võimaldama mingit parooli või muid tundlikke andmeid küsida.
Teine asi... Me saame kasutaja andmed ilma autentimise... see ei ole hea lahendus. Me peame seda parandama.
Aga enne...
Codegeni konfigureerimine
Kasutame GraphQL kood generaatoriga, et saada ühilduv baastüüp, mis põhineb meie skeemil.
Proovime nüüd saada kasutaja ilma sümboolse sümboolse tähiseta
OK, töötab hästi! Proovige sisse logida
Proovime uuesti saada kasutajat, kuid seekord on lisatud märgis päistesse
Lahe! Ja mis siis, kui me määrame valed volitused?
Tore!
Ettevalmistused kasutuselevõtuks
Viimane samm: juuruta serverless api koos Netlify'ga!
Kausta loomine lambda peamise kataloogi ja pane kaks faili sinna sisse:
Esmalt sisaldab AWS käsitseja. See loob ApolloServerLambda serveri instantsi ja seejärel avalikustada käsitseja, kasutades selle instantsi createHandler.