GraphQL/MongoDB API izvēršana, izmantojot Netlify funkcijas
Pawel Rybczynski
Software Engineer
Mērķi Sākotnējā uzstādīšana Instalēt atkarības Sāksim Vispirms pievienojiet tsconfig.json galvenajā direktorijā: Tagad izveidosim src/server.ts serveru implementācijām. Tad pievienojiet divas funkcijas: vienu vietējam serverim un otru lambda. Labi, mums nav neviena resolvera vai tipa definīcijas, tāpēc mums tās ir jāizveido. Pieņemsim, ka sākumā mēs vēlamies, lai [...]
Mērķi
Konfigurējiet gan vietējos, gan lambda serverus.
Savienojiet abus ar MongoDB.
Ieviest pamata autentifikāciju.
Serverless Apollo izvietošana GraphQLAPI ar Netlify.
Labi, mums nav neviena resolvera vai tipa definīcijas, tāpēc mums tās ir jārada. Pieņemsim, ka sākumā mēs vēlamies izveidot lietotājus un saņemt par tiem informāciju.
Neaizmirstiet importēt tipa definīciju un resolveri uz serveri.
// src/server.ts
importēt { ApolloServer as ApolloServerLambda } no "apollo-server-lambda";
import { ApolloServer } no "apollo-server";
importēt { typeDefs } no "./schemas";
importēt { resolvers } no "./resolvers";
{...}
Savienojums ar MongoDB, izmantojot mongoose
Tagad ir īstais laiks izveidot savienojumu ar mūsu datubāzi. Šajā konkrētajā gadījumā tā būs MongoDB. Tā ir bezmaksas un viegli kopjama. Bet pirms tam instalēsim vēl divas atkarības:
Drošība pirmajā vietā! Tagad nodrošināsim paroles, tās šifrējot.
npm install --save bcrypt @types/bcrypt
Tagad ievietojiet paroles drošību pirms starpprogrammatūras izsaukuma atgriezeniskajā saitē. Pre-middleware funkcijas tiek izpildītas viena pēc otras, kad katra starpprogrammatūra izsauc nākamo. Lai paroles būtu drošas, mēs izmantojam metodi, kas ģenerē sāli un hash atsevišķiem funkciju izsaukumiem.
// src/model.ts
importēt bcrypt no "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();
});
});
});
{...}
Pēc tam pievienojiet metodi comparePasswords uz UserSchema:
// 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);
});
};
{...}
Tagad varam izveidot savienojumu starp serveriem un datubāzēm. MONGODB_URI ir vides mainīgais, kas satur savienojuma virkni, kura nepieciešama savienojuma izveidei. To var iegūt klastera panelī pēc tam, kad esat pieteicies savā MongoDB atlas kontā. Ievietojiet to .env
// .env
MONGODB_URI = ....;
Vienmēr atcerieties pievienot šo failu .gitignore. Lieliski! Tagad pievienosim funkciju, kas ļauj izveidot savienojumu ar db.
Konteksts ir objekts, kas ir koplietojams visiem resolveriem. Lai to nodrošinātu, mums tikai jāpievieno konteksta inicializācijas funkcija ApolloServer konstruktoram. Izdarīsim to.
Izskatās jauki! Tagad izveidojiet pamata servera gadījumu:
// src/index.ts
importēt { createLocalServer } no "./server";
require("dotenv").config();
const port = process.env.PORT || 4000;
const server = createLocalServer();
server.listen(port).then(({ url }) => {
console.log(`Serveris ir darbojas pie ${url}`);
});
Vietējā servera palaišana ar Nodemon
Pēdējā lieta pirms palaist, pievienot nodemon.json
Šāda informācija jums būtu jāsaņem termināļa iekšpusē:
Serveris ir darbojas http://localhost:4000/
Ja jā, atveriet http://localhost:4000/ pārlūkprogrammā.
Jāparādās GraphQL spēļu laukumam. Izveidosim jaunu lietotāju!
Aplūkojiet, kā tas izskatās datu bāzē.
Forši! Viss darbojas labi!
Mēģināsim iegūt informāciju par lietotāju.
Un pievienojiet paroles lauku...
Jauki! Mēs saņemam kļūdu Nevar veikt vaicājumu laukā "parole" par tipu "Lietotājs"."". Kā varat pārbaudīt, mēs nepievienojām šo lauku lietotāja tipa definīcijā. Tas tur ir ievietots ar nolūku. Mums nevajadzētu radīt iespēju pieprasīt jebkuru paroli vai citu sensitīvu informāciju. dati.
Vēl viena lieta... Mēs varam iegūt lietotāja datus bez autentifikācijas... tas nav labs risinājums. Mums tas ir jālabo.
Bet pirms...
Konfigurēt Codegen
Izmantosim GraphQL kods ģenerators, lai iegūtu saderīgu bāzes tipu, pamatojoties uz mūsu shēmu.
Mēģināsim vēlreiz iegūt lietotāju, bet šoreiz ar galvenēs pievienotu žetonu.
Forši! Un ko darīt, ja mēs iestatām nepareizus akreditācijas datus?
Jauki!
Sagatavošanās izvietošanai
Pēdējais solis: izvietojiet serverless api ar Netlify!
Izveidot mapi lambda galvenajā dir un ievietot tajā divus failus:
Pirmais satur AWS apstrādātājs. Tā izveido ApolloServerLambda servera gadījumu un pēc tam atklājiet apstrādātāju, izmantojot šī gadījuma createHandler.