В тази статия се стремим да представим кратко ръководство за това как да създадем сигурен API на Node.js GraphQL.
Някои въпроси, които могат да ви дойдат на ум, могат да бъдат:
Всички те са валидни въпроси, но преди да отговорим на тях, трябва да се потопим в кратък преглед на текущото състояние на уеб разработката:
На практика във всеки сценарий ще намерите API, който не е необходимо да знаете в детайли, напр. Не е нужно да знаете как са построени и не е необходимо да използвате същата технология, която беше преди в състояние да го интегрирате във вашата собствена система. Предоставеният API ви позволява да предложите начин за комуникация между услугите в общ стандарт, който както услугата, така и клиентът могат да комуникират, без да се налага да зависи от конкретен технологичен стек.
С добре структурирания API е възможно да имате солиден, поддържаем и мащабируем API, който може да обслужва множество видове клиенти и приложения от предния край.
GraphQL е език за заявки за API, разработен за вътрешна употреба във Facebook и публикуван за обществено ползване през 2015 г. Той поддържа четене, писане и актуализации в реално време. Той също е с отворен код и често се сравнява с REST и други архитектури. Накратко, той се основава на:
Въпреки че тази статия трябва да демонстрира прост, но все пак реален сценарий за това как да се изграждат и използват API на GraphQL, ние няма да предоставим подробно въведение в GraphQL. Причината е проста, тъй като екипът на GraphQL предоставя изчерпателна документация и изброява няколко най-добри практики в своите Въведение в GraphQL .
Както е описано по-горе, заявката е начинът, по който клиентът може да чете и манипулира данни от API. Можете да предадете вида на обекта и да изберете какъв вид полета искате да получите обратно. Една проста заявка би изглеждала по следния начин:
query{ users{ firstName, lastName } }
В тази заявка ние се опитваме да достигнем до всички потребители от схемата на нашите потребители, но получаваме само firstName
и lastName
. Резултатът от тази заявка ще бъде като например:
{ 'data': { 'users': [ { 'firstName': 'Marcos', 'lastName': 'Silva' }, { 'firstName': 'Paulo', 'lastName': 'Silva' } ] } }
Това е доста просто за използване от клиента.
Целта на създаването на API е възможността да има софтуер като услуга, която може да бъде интегрирана от други външни услуги. Дори ако приложението ви се консумира от един интерфейс, можете да разгледате този интерфейс като външна услуга и за това ще можете да работите в различни проекти, когато комуникацията между двете се осигурява чрез API.
как работи носимата технология
Ако работите в голям екип, той може да бъде разделен, за да се създаде екип от преден и отзад, което позволява на двамата да използват една и съща технология и да улеснят работата си. Когато създавате API, е важно да изберете по-подходящото за проекта и това, което ви приближава до желаното решение.
В тази статия ще се съсредоточим върху скелет за изграждане на API, който използва GraphQL.
Може да е малко прикритие, но не мога да се справя: Това зависи .
GraphQL е подход, който се вписва много добре в няколко сценария. REST е архитектурен подход, който се доказва и в няколко сценария. В днешно време има тонове статии, които обясняват защо едната е по-добра от другата или защо трябва да използвате само REST вместо GraphQL. И също така, много начини, по които можете да използвате GraphQL вътрешно и все пак да поддържате крайните точки на API като REST-базирана архитектура.
Най-доброто ръководство би било да знаете предимствата на всеки подход, да анализирате решението, което създавате, да прецените колко удобно е екипът ви да работи с решението и да прецените дали ще можете да насочите екипа си да учи и да отговори ускорете бързо, преди да изберете между подходи.
Тази статия е по-скоро практическо ръководство, отколкото субективно сравнение на GraphQL и REST. В случай, че искате да прочетете подробно сравнение на двете, предлагам ви да разгледате още една от нашите статии, GraphQL срещу REST - Урок за GraphQL .
В днешната статия ще се съсредоточим върху създаването на API на GraphQL с помощта на Node.js.
GraphQL има няколко различни библиотеки, които можете да използвате. За целите на тази статия решихме да се примирим с идеята да използваме JavaScript с Node.js поради широкото им използване и факта, че Node.js позволява на разработчиците да използва познатия синтаксис отпред за разработване от страна на сървъра.
принципи на примери за модел на дизайн
Също така е полезно да сравним с нашия подход с REST-базиран API, подобен на този, който беше демонстриран в друга статия на ApeeScape Engineering Blog: Създаване на защитен REST API в Node.js . Тази статия също така представя използването на Node.js с Експрес да разработите скелетен REST API, който ще ви позволи да сравните някои разлики между тези два подхода. Node.js също е проектиран с мащабируеми мрежови приложения, глобална общност и няколко библиотеки с отворен код, които можете да намерите в npm уебсайт .
Този път ще покажем как да изградим скелетен API с GraphQL, Node.js и Express!
Както беше посочено по-рано, ще изградим идея за скелет за GraphQL API и ще трябва да знаете основите на Node.js и Express, преди да продължите. Наличен е изходният код на проекта, направен за този пример на GraphQL тук .
Ще обработваме два вида ресурси:
Потребителите ще съдържат следната структура:
Продуктите ще съдържат следната структура:
Що се отнася до стандарта за кодиране, ще използваме TypeScript за този проект. В изходния файл ще можете да конфигурирате всичко, за да започнете да кодирате с TypeScript.
На първо място, уверете се, че имате инсталирана най-новата версия на Node.js. Към момента на публикуване текущата версия е 10.15.3, според Nodejs.org .
Нека започнем в нова папка, която можем да наречем node-graphql
. Там можем да отворим терминал или конзола на Git CLI и да стартираме магията, като използваме следната команда: npm init
.
За да ускорите процеса, заменете вашия package.json
със следното в нашето хранилище Git трябва да съдържа всички необходими зависимости:
google dorks за данни за кредитна карта 2018 г
{ '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' } }
С актуализирания package.json
, просто натиснете терминала отново и използвайте: npm install
. Той ще инсталира всички зависимости, необходими за стартиране на този GraphQL API в Node.js и Express.
Следващото парче е да конфигурираме нашия TypeScript режим. Нуждаем се от файл, наречен tsconfig.json
в нашата основна папка със следното:
{ 'compilerOptions': { 'target': 'ES2016', 'module': 'commonjs', 'outDir': './build', 'strict': true, 'esModuleInterop': true } }
Логиката на кода за тази конфигурация ще присъства в папката на приложението. Там можем да създадем app.ts
файл и за основно тестване добавете следния код там:
console.log('Hello Graphql Node API tutorial');
По нашата конфигурация вече можем да стартираме npm start
и изчакайте компилация и ще можете да тествате дали всичко работи правилно. Във вашата терминална конзола трябва да видите нашия „Урок за API на Graph Graph Node“. В задната сцена конфигурацията основно компилира TypeScript кода в чист JavaScript и след това изпълнява нашата компилация в build
папка.
Сега нека конфигурираме основен скелет за нашия API на GraphQL. За стартиране на нашия проект ще добавим три основни вноса:
Нека започнем да сглобяваме всичко:
import express from 'express'; import graphqlHTTP from 'express-graphql'; import {makeExecutableSchema} from 'graphql-tools';
Сега трябва да можем да започнем да кодираме малко. Следващата стъпка е да се справим с нашето приложение в Express и с основната конфигурация на GraphQL като:
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}!`));
Това, което правим е:
Добре, но какво се случва за typeDefs и резолвери, както и отношение към заявки и мутации?
Сега, да бягаме начало над морското равнище отново да видим какво имаме там. Очакваме, че приложението ще работи със следното съобщение: Node Graphql API слушане на порт 3000!
Вече можем да се опитаме да направим заявка и да тестваме GraphQL API на собствения си сървър чрез: http: // localhost: 3000 / graphql
Чудесно, сега можем да напишем първата си собствена заявка, която беше определена като „здравей“.
Имайте предвид, че начина, по който го дефинирахме на typeDefs
, страницата може да ни помогне да изградим заявката.
Това е страхотно, но как можем да променим стойността? Мутации!
Сега нека видим какво се случва, когато променим стойността си в паметта с мутация:
Сега можем да правим основни CRUD операции с нашия API на GraphQL Node.js. Нека напредваме с нашия код сега.
За продукти ще използваме модул, наречен продукти. Като опит за опростяване на тази статия ще използваме база данни в паметта само за демонстрация. Ще определим модел и услуга за управление на продукти.
react native qr код скенер
Нашият модел ще се основава, както следва:
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, ще бъде дефинирана като:
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; }; } }
За потребителите ще следваме същата структура като модула продукти. Ще имаме модел и услуга за потребителите. Моделът ще бъде дефиниран като:
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; } }
Междувременно нашата услуга ще бъде като:
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; }; } }
За напомняне, изходният код е достъпен за използване от това връзка .
Сега можем да играем и да тестваме нашия код. Нека да стартираме npm start
. Ще имаме сървъра, работещ на порт 3000. Вече имаме достъп до GraphQL за тестване на http: // localhost: 3000 / graphql .
Нека опитаме с мутация, за да добавим елемент към нашия списък с продукти:
За да проверим дали е работило, сега ще използваме заявка за продукти, но получавайки само id
, name
и price
:
query{ products{ id, name, price } } The response will be: { 'data': { 'products': [ { 'id': 100, 'name': 'My amazing product', 'price': 400 } ] } }
И това е; продуктът работи според очакванията. Сега можем да играем и да превключваме полетата наоколо, ако искаме. Можете да опитате да добавите описание:
query{ products{ id, name, description, price } }
Сега можем да имаме описанията на нашите продукти. Нека изпробваме потребителите сега.
mutation{ user(id:200, firstName:'Marcos', lastName:'Silva', password:'amaz1ingP4ss', permissionLevel:9, email:' [email protected] ') { id } }
И заявката ще бъде като:
query{ users{ id, firstName, lastName, password, email } }
С отговор като:
{ 'data': { 'users': [ { 'id': 200, 'firstName': 'Marcos', 'lastName': 'Silva', 'password': 'kpj6Mq0tGChGbZ+BT9Nw6RMCLReZEPPyBCaUS3X23lZwCCp1Ogb94/oqJlya0xOBdgEbUwqRSuZRjZGhCzLdeQ==', 'email': ' [email protected] ' } ] } }
И сега нашият скелет GraphQL е готов! Има много стъпки оттук към полезен, напълно функционален API, но основното ядро вече е зададено.
Дори режещите ръбове за съкращаване, статията е доста голяма с много основна информация относно разработването на API на GraphQL Node.js.
Нека да прегледаме това, което разгледахме досега:
За да се съсредоточим повече върху развитието на нещата, ние избегнахме няколко важни елемента, които могат да бъдат обобщени накратко, както следва:
Не забравяйте, че в този Git имаме пълния изходен код връзка . Чувствайте се свободни да използвате, разклонявате, отваряте издания, отправяте заявки за изтегляне и играете с него! Моля, обърнете внимание, че всички стандарти и предложения, направени в тази статия, не са издълбани в камък.
Това е само един от многото подходи, които могат да се използват, за да започнете да проектирате свой собствен GraphQL API. Също така, не забравяйте да прочетете и проучите GraphQL по-подробно, като научите какво предлага и как може да направи вашите API-та още по-добри.
GraphQL е дефиниран като език за заявки за клиентски API и време за изпълнение на сървъра за изпълнение на тези заявки. Въпреки това, GraphQL не е точно език, но има свой синтаксис и може да бъде разработен в рамките на няколко програмни езика, като Node.js.
js не е функция
GraphQL опростява използването на клиента, за да прави заявки и да филтрира това, което клиентът всъщност трябва да консумира, избягвайки предаването на допълнителни данни от сървърната страна към клиентската страна. Това е добра алтернатива на REST, но може да се използва и с REST.
Node.js е среда за изпълнение на платформа на JavaScript, която ни позволява да разработваме сървъри от заден план, използвайки синтаксис на JavaScript. Той може да подобри скоростта на разработка, когато софтуерният инженер е в състояние да кодира с JavaScript, както отзад (node.js), така и отпред (като Angular или React).
Node.js се оказа много стабилен и бърз през последните години. Той е добър за многозадачност и работи върху V8 двигателя, който се използва от Chrome.