Güvenli Node.js GraphQL API Nasıl Oluşturulur

Yayınlanan: 2022-03-11

Bu yazıda, güvenli bir Node.js GraphQL API'sinin nasıl oluşturulacağına dair hızlı bir kılavuz sunmayı amaçlıyoruz.

Akla gelebilecek bazı sorular şunlar olabilir:

  • GraphQL API kullanmanın amacı nedir?
  • GraphQL API nedir?
  • GraphQL sorgusu nedir?
  • GraphQL'nin faydası nedir?
  • GraphQL, REST'ten daha mı iyi?
  • Neden Node.js kullanıyoruz?

Tüm bunlar geçerli sorulardır, ancak bunları yanıtlamadan önce, web geliştirmenin şu anki durumuna kısa bir genel bakış sunmalıyız:

  • Bugün bulacağınız hemen hemen her çözüm, bir tür uygulama programlama arabirimi (API) kullanır.
  • Sadece Facebook veya Instagram gibi bir sosyal ağ kullansanız bile, API tüketen bir ön uca bağlısınız.
  • Merak ediyorsanız, Netflix, Spotify ve YouTube gibi hizmetler de dahil olmak üzere neredeyse tüm çevrimiçi eğlence hizmetlerinin farklı türde bir API kullandığını göreceksiniz.

Hemen hemen her senaryoda, ayrıntılı olarak bilmeniz gerekmeyen bir API bulacaksınız, örneğin nasıl oluşturulduklarını bilmenize gerek yok ve eskiden olduğu gibi aynı teknolojiyi kullanmanıza gerek yok. kendi sisteminize entegre edebilirsiniz. Sağlanan API, belirli bir teknoloji yığınına bağlı olmak zorunda kalmadan hem hizmetin hem de istemcinin iletişim kurabileceği ortak bir standartta hizmetler arasında iletişim kurmanın bir yolunu sunmanıza olanak tanır.

İyi yapılandırılmış bir API ile, birden fazla türde istemciye ve ön uç uygulamaya hizmet edebilen sağlam, bakımı yapılabilir ve ölçeklenebilir bir API'ye sahip olmak mümkündür.

Dedi ki, GraphQL API Nedir ?

GraphQL, Facebook'ta dahili kullanım için geliştirilmiş ve 2015 yılında genel kullanıma sunulan API'ler için bir sorgu dilidir. Okuma, yazma ve gerçek zamanlı güncellemeleri destekler. Aynı zamanda açık kaynak kodludur ve genellikle REST ve diğer mimarilerle karşılaştırılır. Özetle, şunlara dayanmaktadır:

  • GraphQL Sorguları - Bu, istemcinin verilerin nasıl alınması gerektiğini okumasını ve yönetmesini sağlar.
  • GraphQL Mutations - Bu, sunucuya verinin nasıl yazılacağıdır. Sisteme nasıl veri yazılacağına ilişkin GraphQL sözleşmesidir.

Bu makalenin, GraphQL API'lerinin nasıl oluşturulacağına ve kullanılacağına ilişkin basit, ancak gerçek dünya senaryosunu göstermesi beklense de, GraphQL'e ayrıntılı bir giriş yapmayacağız. GraphQL ekibi kapsamlı belgeler sağladığından ve GraphQL'e Giriş bölümünde birkaç en iyi uygulamayı listelediğinden, nedeni basittir.

GraphQL Sorgusu Nedir?

Daha önce açıklandığı gibi, bir sorgu, bir istemcinin API'den gelen verileri okuyabilmesi ve değiştirebilmesinin yoludur. Bir nesnenin türünü iletebilir ve hangi tür alanları geri almak istediğinizi seçebilirsiniz. Basit bir sorgu aşağıdaki gibi olacaktır:

 query{ users{ firstName, lastName } }

Bu sorguda, kullanıcılarımızın şemasından tüm kullanıcılara ulaşmaya çalışıyoruz, ancak yalnızca firstName ve lastName alıyor. Bu sorgunun sonucu örneğin şöyle olacaktır:

 { "data": { "users": [ { "firstName": "Marcos", "lastName": "Silva" }, { "firstName": "Paulo", "lastName": "Silva" } ] } }

İstemci kullanımı için oldukça basittir.

GraphQL API Kullanmanın Amacı Nedir?

API oluşturmanın amacı, diğer harici hizmetler tarafından entegre edilebilen bir hizmet olarak yazılıma sahip olma yeteneğidir. Uygulamanız tek bir front-end tarafından tüketilse bile bu front-end'i harici bir servis olarak düşünebilirsiniz ve bunun için ikisi arasındaki iletişim API üzerinden sağlandığında farklı projelerde çalışabileceksiniz.

Büyük bir ekipte çalışıyorsanız, her ikisinin de aynı teknolojiyi kullanmasına ve işlerini kolaylaştırmasına olanak tanıyan bir ön uç ve arka uç ekibi oluşturmak için bölünebilir. Bir API'yi tasarlarken, projeye daha uygun olanı ve sizi istediğiniz çözüme yaklaştıran şeyi seçmek önemlidir.

Bu yazıda, GraphQL kullanan bir API oluşturmak için bir iskelete odaklanacağız.

GraphQL, REST'ten Daha İyi mi?

Biraz kopukluk olabilir, ama yardım edemem: Bu, .

GraphQL, birkaç senaryoya çok iyi uyan bir yaklaşımdır. REST, çeşitli senaryolarda da kanıtlanmış bir mimari yaklaşımdır. Günümüzde neden birinin diğerinden daha iyi olduğunu veya neden GraphQL yerine yalnızca REST kullanmanız gerektiğini açıklayan tonlarca makale var. Ayrıca, GraphQL'i dahili olarak kullanmanın ve API'nin uç noktalarını REST tabanlı bir mimari olarak korumanın birçok yolu.

En iyi rehberlik, her yaklaşımın faydalarını bilmek, yarattığınız çözümü analiz etmek, ekibinizin çözümle ne kadar rahat çalıştığını değerlendirmek ve ekibinize öğrenmeleri ve yükselmeleri için rehberlik edip edemeyeceğinizi değerlendirmek olacaktır. yaklaşımlar arasında seçim yapmadan önce hızlı hız.

Bu makale, GraphQL ve REST'in öznel bir karşılaştırmasından ziyade pratik bir kılavuzdur. İkisinin ayrıntılı bir karşılaştırmasını okumak isterseniz, makalelerimizden biri olan GraphQL vs. REST - A GraphQL Eğitimi'ne göz atmanızı öneririm.

Bugünkü makalemizde Node.js kullanarak bir GraphQL API oluşturmaya odaklanacağız.

Neden Node.js Kullanıyoruz?

GraphQL, kullanabileceğiniz birkaç farklı kitaplığa sahiptir. Bu makalenin amacı doğrultusunda, yaygın kullanımları ve Node.js'nin geliştiricilerin sunucu tarafı geliştirme için tanıdık ön uç sözdizimini kullanmalarına izin vermesi nedeniyle JavaScript'i Node.js ile kullanma fikrinden yola çıktık.

Ayrıca, başka bir Toptal Engineering Blog makalesinde gösterilene benzer, REST tabanlı bir API ile yaklaşımımızı karşılaştırmak da yararlıdır: Node.js'de Güvenli REST API Oluşturma. Bu makale ayrıca, bu iki yaklaşım arasındaki bazı farklılıkları karşılaştırmanıza izin verecek bir iskelet REST API geliştirmek için Express ile Node.js'nin kullanımını gösterir. Node.js ayrıca ölçeklenebilir ağ uygulamaları, küresel bir topluluk ve npm web sitesinde bulabileceğiniz çeşitli açık kaynaklı kitaplıklar ile tasarlanmıştır.

Bu sefer GraphQL, Node.js ve Express ile bir iskelet API'sinin nasıl oluşturulacağını göstereceğiz!

GraphQL Eğitiminde Uygulamalı

Daha önce belirtildiği gibi, GraphQL API için bir çerçeve fikir oluşturacağız ve devam etmeden önce Node.js ve Express'in temellerini bilmeniz gerekecek. Bu GraphQL örneği için yapılan projenin kaynak kodu burada mevcuttur.

İki tür kaynağı ele alacağız:

  • Temel bir CRUD ile ilgileneceğimiz kullanıcılar .
  • GraphQL'in gücünü daha fazla göstermek için biraz ayrıntıya sahip olacağımız ürünler.

Kullanıcılar aşağıdaki yapıyı içerecektir:

  • İD
  • ilk adı
  • Soyadı
  • e-posta
  • şifre
  • izin seviyesi

Ürünler aşağıdaki yapıyı içerecektir:

  • İD
  • isim
  • tanım
  • fiyat

Kodlama standardına gelince, bu proje için TypeScript kullanacağız. Kaynak dosyada, TypeScript ile kodlamaya başlamak için her şeyi yapılandırabileceksiniz.

Hadi Kodlayalım!

Her şeyden önce, en son Node.js sürümünün kurulu olduğundan emin olun. Yayınlandığı tarihte, mevcut sürüm Nodejs.org'a göre 10.15.3'tür.

Projeyi Başlatma

node-graphql adını verebileceğimiz yeni bir klasörle başlayalım. Orada, bir terminal veya Git CLI konsolu açabilir ve aşağıdaki komutu kullanarak sihri başlatabiliriz: npm init .

Bağımlılıklarımızı ve TypeScript'i Yapılandırma

Süreci hızlandırmak için package.json Git depomuzdaki aşağıdakiyle değiştirmek, gerekli tüm bağımlılıkları içermelidir:

 { "name": "node-graphql", "version": "1.0.0", "description": "", "main": "dist/index.js", "scripts": { "tsc": "tsc", "start": "npm run tsc && node ./build/app.js" }, "author": "", "license": "ISC", "dependencies": { "@types/express": "^4.16.1", "@types/express-graphql": "^0.6.2", "@types/graphql": "^14.0.7", "express": "^4.16.4", "express-graphql": "^0.7.1", "graphql": "^14.1.1", "graphql-tools": "^4.0.4" }, "devDependencies": { "tslint": "^5.14.0", "typescript": "^3.3.4000" } }

Güncellenmiş package.json ile, terminale tekrar basın ve şunu kullanın: npm install . Bu GraphQL API'sini Node.js ve Express içinde çalıştırmak için gereken tüm bağımlılıkları yükleyecektir.

Sonraki parça, TypeScript modumuzu yapılandırmaktır. Kök klasörümüzde aşağıdakileri içeren tsconfig.json adlı bir dosyaya ihtiyacımız var:

 { "compilerOptions": { "target": "ES2016", "module": "commonjs", "outDir": "./build", "strict": true, "esModuleInterop": true } }

Bu yapılandırma için kodun mantığı, uygulama klasöründe bulunacaktır. Orada bir app.ts dosyası oluşturabiliriz ve temel testler için oraya aşağıdaki kodu ekleyebiliriz:

 console.log('Hello Graphql Node API tutorial');

Yapılandırmamızla, artık npm start ve bir derleme için bekleyebilir ve her şeyin düzgün çalıştığını test edebiliriz. Terminal konsolunuzda “Merhaba GraphQL Node API eğitimimizi” görmelisiniz. Arka sahnede, yapılandırma temel olarak TypeScript kodunu saf JavaScript'te derler ve ardından build klasöründeki derlememizi yürütür.

Şimdi GraphQL API'miz için temel bir iskelet yapılandıralım. Projemize başlamak için üç temel ithalat ekleyeceğiz:

  • ifade etmek
  • Express-graphql
  • Graphql araçları

Hepsini bir araya getirmeye başlayalım:

 import express from 'express'; import graphqlHTTP from 'express-graphql'; import {makeExecutableSchema} from 'graphql-tools';

Artık biraz kodlamaya başlayabiliriz. Bir sonraki adım, Express'teki uygulamamızla ve aşağıdaki gibi temel GraphQL yapılandırmasıyla ilgilenmektir:

 import express from 'express'; import graphqlHTTP from 'express-graphql'; import {makeExecutableSchema} from 'graphql-tools'; const app: express.Application = express(); const port = 3000; let typeDefs: any = [` type Query { hello: String } type Mutation { hello(message: String) : String } `]; let helloMessage: String = 'World!'; let resolvers = { Query: { hello: () => helloMessage }, Mutation: { hello: (_: any, helloData: any) => { helloMessage = helloData.message; return helloMessage; } } }; app.use( '/graphql', graphqlHTTP({ schema: makeExecutableSchema({typeDefs, resolvers}), graphiql: true }) ); app.listen(port, () => console.log(`Node Graphql API listening on port ${port}!`));

Yaptığımız şey:

  • Express sunucu uygulamamız için 3000 numaralı bağlantı noktası etkinleştiriliyor.
  • Hızlı bir örnek olarak kullanmak istediğimiz sorguları ve mutasyonları tanımlamak.
  • Sorguların ve mutasyonların nasıl çalışacağını tanımlama.

Tamam, ancak typeDef'ler ve çözümleyicilerin yanı sıra sorgular ve mutasyonlarla ilgili olarak neler oluyor?

  • typeDefs - Sorgulardan ve mutasyonlardan ne bekleyebileceğimize dair şemamızın tanımı.
  • Çözümleyiciler - Alanların veya gerekli parametrelerin beklentisi yerine, burada sorguların ve mutasyonların nasıl çalışacağının işlevlerini ve davranışlarını tanımlarız.
  • Sorgular - Sunucudan okumak istediğimiz "alır".
  • Mutasyonlar - Kendi sunucumuzdaki herhangi bir veriyi etkileyecek isteklerimiz.

Şimdi, elimizde ne olduğunu görmek için npm start'ı tekrar çalıştıralım. Uygulamanın aşağıdaki mesajla çalışmasını bekleriz: Node Graphql API, 3000 numaralı bağlantı noktasında dinleme yapıyor!

Artık GraphQL API'sini http://localhost:3000/graphql üzerinden kendi sunucumuzda sorgulamayı ve test etmeyi deneyebiliriz.

GraphQL öğreticisi: sunucu testi

Harika, şimdi "merhaba" olarak tanımlanan ilk kendi sorgumuzu yazabiliriz.

GraphQL öğreticisi: ilk sorgu

Sayfanın typeDefs tanımlama şeklimizin sorguyu oluşturmamıza yardımcı olabileceğini unutmayın.

Bu harika, ama değeri nasıl değiştirebiliriz? Mutasyonlar!

Şimdi bir mutasyonla in-memory değerimizi değiştirdiğimizde ne olacağını görelim:

GraphQL öğreticisi: mutasyonun gösterimi

Artık GraphQL Node.js API'miz ile temel CRUD işlemlerini yapabiliriz. Şimdi kodumuzla ilerleyelim.

Ürün:% s

Ürünler için ürünler adında bir modül kullanacağız. Bu makaleyi basitleştirme çabası olarak, yalnızca gösterim için bir bellek içi veritabanı kullanacağız. Ürünleri yönetmek için bir model ve bir hizmet tanımlayacağız.

Modelimiz aşağıdaki gibi olacaktır:

 export class Product { private id: Number = 0; private name: String = ''; private description: String = ''; private price: Number = 0; constructor(productId: Number, productName: String, productDescription: String, price: Number) { this.id = productId; this.name = productName; this.description = productDescription; this.price = price; } }

GraphQL ile haberleşecek olan servis şu şekilde tanımlanacaktır:

 export class ProductsService { public products: any = []; configTypeDefs() { let typeDefs = ` type Product { name: String, description: String, id: Int, price: Int } `; typeDefs += ` extend type Query { products: [Product] } `; typeDefs += ` extend type Mutation { product(name:String, id:Int, description: String, price: Int): Product! }`; return typeDefs; } configResolvers(resolvers: any) { resolvers.Query.products = () => { return this.products; }; resolvers.Mutation.product = (_: any, product: any) => { this.products.push(product); return product; }; } }

Kullanıcılar

Kullanıcılar için ürünler modülü ile aynı yapıyı izleyeceğiz. Kullanıcılar için bir modelimiz ve hizmetimiz olacak. Model şu şekilde tanımlanacaktır:

 export class User { private id: Number = 0; private firstName: String = ''; private lastName: String = ''; private email: String = ''; private password: String = ''; private permissionLevel: Number = 1; constructor(id: Number, firstName: String, lastName: String, email: String, password: String, permissionLevel: Number) { this.id = id; this.firstName = firstName; this.lastName = lastName; this.email = email; this.password = password; this.permissionLevel = permissionLevel; } }

Bu arada, hizmetimiz şöyle olacak:

 const crypto = require('crypto'); export class UsersService { public users: any = []; configTypeDefs() { let typeDefs = ` type User { firstName: String, lastName: String, id: Int, password: String, permissionLevel: Int, email: String } `; typeDefs += ` extend type Query { users: [User] } `; typeDefs += ` extend type Mutation { user(firstName:String, lastName: String, password: String, permissionLevel: Int, email: String, id:Int): User! }`; return typeDefs; } configResolvers(resolvers: any) { resolvers.Query.users = () => { return this.users; }; resolvers.Mutation.user = (_: any, user: any) => { let salt = crypto.randomBytes(16).toString('base64'); let hash = crypto.createHmac('sha512', salt).update(user.password).digest("base64"); user.password = hash; this.users.push(user); return user; }; } }

Bir hatırlatma olarak, kaynak kodu bu bağlantıdan kullanılabilir.

Artık kodumuzu oynayabilir ve test edebiliriz. npm start . Sunucunun 3000 numaralı bağlantı noktasında çalışmasını sağlayacağız. Artık test için GraphQL'ye http://localhost:3000/graphql adresinden erişebiliriz.

Ürün listemize bir ürün eklemek için bir mutasyon deneyelim:

Node.js GraphQL mutasyon gösterimi

İşe yarayıp yaramadığını test etmek için, şimdi ürünler için bir sorgu kullanacağız, ancak yalnızca id , name ve price alıyoruz:

 query{ products{ id, name, price } } The response will be: { "data": { "products": [ { "id": 100, "name": "My amazing product", "price": 400 } ] } }

Ve bu kadar; ürün beklendiği gibi çalışıyor. Artık istersek sahaları değiştirebilir ve oynayabiliriz. Bir açıklama eklemeyi deneyebilirsiniz:

 query{ products{ id, name, description, price } }

Artık ürünlerimizin açıklamalarına geçebiliriz. Şimdi kullanıcıları deneyelim.

 mutation{ user(id:200, firstName:"Marcos", lastName:"Silva", password:"amaz1ingP4ss", permissionLevel:9, email:"[email protected]") { id } }

Ve bir sorgu şöyle olacak:

 query{ users{ id, firstName, lastName, password, email } }

Gibi bir yanıtla:

 { "data": { "users": [ { "id": 200, "firstName": "Marcos", "lastName": "Silva", "password": "kpj6Mq0tGChGbZ+BT9Nw6RMCLReZEPPyBCaUS3X23lZwCCp1Ogb94/oqJlya0xOBdgEbUwqRSuZRjZGhCzLdeQ==", "email": "[email protected]" } ] } }

Ve şimdi GraphQL iskeletimiz hazır! Buradan kullanışlı, tamamen işlevsel bir API'ye doğru tonlarca adım var, ancak temel çekirdek şimdi ayarlandı.

Özet ve Son Düşünceler

Kısaltmak için keskin kenarlar bile olsa, makale bir GraphQL Node.js API'sinin geliştirilmesine ilişkin birçok temel bilgi ile oldukça büyüktür.

Şimdiye kadar ele aldıklarımızı gözden geçirelim:

  • GraphQL API'si oluşturmak için Node.js'nin Express ve GraphQL ile kullanımı;
  • Temel GraphQL kullanımı;
  • Sorguların ve mutasyonların temel kullanımı;
  • Projeniz için modüller oluşturmaya temel yaklaşım;
  • GraphQL API'mizi test etmek;

İşin geliştirme tarafına daha fazla odaklanmak için kısaca aşağıdaki gibi özetlenebilecek birkaç önemli maddeden kaçındık:

  • Yeni öğeler için doğrulamalar;
  • Genel bir hata hizmetiyle hataları düzgün bir şekilde ele almak;
  • Bir kullanıcının genel bir hizmetle her istekte kullanabileceği alanları doğrulama;
  • API'yi güvenceye almak için bir JWT önleyici ekleyin;
  • Parola karmasını daha etkili bir yaklaşımla ele alın;
  • Birim ve entegrasyon testleri ekleyin;

Bu Git bağlantısında tam kaynak koduna sahip olduğumuzu unutmayın. Kullanmaktan, çatallamaktan, sorunları açmaktan, çekme isteklerinde bulunmaktan ve onunla oynamaktan çekinmeyin! Lütfen bu makalede yapılan tüm standartların ve önerilerin taşa oyulmadığını unutmayın.

Bu, kendi GraphQL API'nizi tasarlamaya başlamak için kullanılabilecek birçok yaklaşımdan sadece biridir. Ayrıca, GraphQL'nin neler sunabileceğini ve API'lerinizi nasıl daha da iyi hale getirebileceğini öğrenerek GraphQL'i daha ayrıntılı okuyup araştırdığınızdan emin olun.