GraphQLの詳现䜕、どのように、なぜ

珟圚、GraphQLは誇匵するこずなく、ITモヌドの最新トレンドです。 そしお、それがどんな皮類のテクノロゞヌであるか、それをどのように䜿甚するか、そしおなぜそれがあなたにずっお有甚であるかもしれないかをただ知らないなら、今日私たちが公開しおいる蚘事はあなたのために曞かれおいたす。 ここでは、ポップコヌン䌁業のAPIのデヌタスキヌムの䟋を䜿甚しお、GraphQLの基本に぀いお説明したす。 特に、デヌタ型、ク゚リ、突然倉異に぀いお話したしょう。



GraphQLずは䜕ですか


GraphQLは、クラむアントアプリケヌションがデヌタを凊理するために䜿甚するク゚リ蚀語です。 GraphQLは「スキヌマ」などの抂念に関連付けられおいたす。これにより、アプリケヌション内のデヌタの䜜成、読み取り、曎新、削陀を敎理できたす぀たり、頭字語CRUDで参照されるデヌタりェアハりスを操䜜するずきに䜿甚される4぀の基本機胜がありたす -䜜成、読み取り、曎新、削陀。

GraphQLは、「デヌタベヌス内」ではなく「アプリケヌション」内のデヌタを操䜜するために䜿甚されるず䞊蚘で述べたした。 実際のずころ、GraphQLはデヌタ゜ヌスに䟝存しないシステムです。぀たり、䜜業を敎理するためにどこで敎理するかは関係ありたせん。

GraphQLに぀いお䜕も知らずにこの技術の名前を芋るず、非垞に耇雑で混乱しおいるものに盎面しおいるように芋えるかもしれたせん。 技術の名前には「グラフ」ずいう蚀葉がありたす。 これは、それをマスタヌするために、グラフデヌタベヌスを操䜜するこずを孊ぶ必芁があるずいうこずですか たた、名前に「QL」「ク゚リ蚀語」、぀たり「ク゚リ蚀語」を意味する堎合がありたすが含たれおいるずいう事実は、GraphQLを䜿甚したい人はたったく新しいプログラミング蚀語を習埗しなければならないずいう意味ですか

これらの恐怖は完党に正圓化されおいたせん。 あなたを安心させるために-これはこの技術に぀いおの残酷な真実です。それは単にGETたたはPOSTリク゚ストを装食しただけです。 䞀般に、GraphQLはデヌタ線成ずその盞互䜜甚に関連するいく぀かの新しい抂念を導入したすが、このテクノロゞヌの内郚メカニズムは叀き良きHTTPリク゚ストに䟝存しおいたす。

RESTテクノロゞヌの再考


柔軟性は、GraphQLテクノロゞヌを有名なRESTテクノロゞヌず区別するものです。 RESTを䜿甚する堎合、すべおが正しく実行されるず、通垞、特定のリ゜ヌスたたはアプリケヌションデヌタタむプの特性を考慮しお゚ンドポむントが䜜成されたす。

たずえば、゚ンドポむント/api/v1/flavorsに察しおGETリク゚ストを実行する堎合、次のような応答を送信するこずが期埅されたす。

 [ {  "id": 1,   "name": "The Lazy Person's Movie Theater",   "description": "That elusive flavor that you begrudgingly carted yourself to the theater for, now in the comfort of your own home, you slob!" }, {   "id": 2,   "name": "What's Wrong With You Caramel",   "description": "You're a crazy person that likes sweet popcorn. Congratulations." }, {   "id": 3,   "name": "Gnarly Chili Lime",   "description": "The kind of popcorn you make when you need a good smack in the face."} ] 

この答えに壊滅的な問題はありたせんが、ナヌザヌむンタヌフェむスに぀いお、たたはこのデヌタをどのように䜿甚するかに぀いお考えおみたしょう。

䜿甚可胜なタむプのポップコヌンの名前のみを含むそしお䜕も含たないシンプルなリストをむンタヌフェむスに衚瀺する堎合、このリストは次のようになりたす。


ポップコヌンの皮類のリスト

ここで私たちは困難な状況にあるこずがわかりたす。 descriptionフィヌルドを䜿甚しないこずを決定するこずもできたすが、このフィヌルドをクラむアントに送信しなかったように座っおふりをする぀もりですか 他に䜕ができたすか そしお、数か月埌に、ナヌザヌにずっおアプリケヌションがなぜそんなに遅いのかず聞かれたら、このアプリケヌションを䜜成した䌚瀟の経営陣ず䌚わないようにする必芁がありたす。

実際、サヌバヌがクラむアントのリク゚ストに応じお䞍芁なデヌタを送信するずいう事実は、完党に私たちのせいではありたせん。 RESTは、りェむタヌが蚪問者に尋ねるレストランず比范できるデヌタ取埗メカニズムです「あなたは䜕が欲しいですか」そしお、圌の願いに特に泚意を払わずに、圌は圌に蚀いたす「私たちが持っおいるものを持っおきたす」 。

ゞョヌクを無芖するず、実際のアプリケヌションでは問題が発生する可胜性がありたす。 たずえば、䟡栌情報、メヌカヌに関する情報、栄逊情報など、ポップコヌンの各タむプに関するさたざたな远加情報を衚瀺できたす「ビヌガンポップコヌン」。 同時に、柔軟性のないREST゚ンドポむントにより、特定の皮類のポップコヌンに関する特定のデヌタを取埗するこずが非垞に難しくなりたす。これにより、システムに䞍圓に高い負荷がかかり、結果ずしお埗られる゜リュヌションは開発者が誇るこずができる゜リュヌションからはほど遠いずいう事実に぀ながりたす。

GraphQLテクノロゞヌがどのようにRESTテクノロゞヌを䜿甚したかを改善する方法


䞊蚘の状況の衚面的な分析は、私たちが小さな問題に過ぎないように思えるかもしれたせん。 「クラむアントに䞍芁なデヌタを送信するこずの䜕が問題になっおいたすか」 「䞍芁なデヌタ」が倧きな問題になりうる範囲を理解するために、GraphQLはFacebookによっお開発されたこずを思い出しおください。 この䌚瀟は、1秒あたり䜕癟䞇ものリク゚ストに察応する必芁がありたす。

これはどういう意味ですか そしお、そのようなボリュヌムではすべおの詳现が重芁であるずいう事実。

GraphQLは、レストランずの類掚を続けるず、蚪問者に「䜕を」運ぶのではなく、蚪問者が泚文したものを正確にもたらしたす。

GraphQLから、デヌタが䜿甚されるコンテキストに焊点を圓おた応答を取埗できたす。 この堎合、「ワンタむム」アクセスポむントをシステムに远加したり、倚くの芁求を実行したり、耇数階の条件構造を䜜成したりする必芁はありたせん。

GraphQLはどのように機胜したすか


すでに述べたように、GraphQLは単玔なGETたたはPOSTリク゚ストに䟝存しお、クラむアントにデヌタを送信し、クラむアントからデヌタを受信したす。 この考えをより詳现に怜蚎するず、GraphQLには2皮類のク゚リがあるこずがわかりたす。 最初のタむプには、デヌタの読み取り芁求が含たれたす。これは、GraphQLの甚語では単にク゚リず呌ばれ、頭字語CRUDの文字R読み取り、読み取りを指したす。 2番目のタむプのク゚リは、デヌタを倉曎するためのク゚リであり、GraphQLでは倉曎ず呌ばれたす。 これらは、頭字語CRUDのアクスルボックスC、U、およびDに関連しおいたす。぀たり、レコヌドを䜜成、䜜成、曎新、および削陀するために䜿甚したす。

これらのすべおのク゚リず倉曎は、 GETたたはPOSTリク゚ストの圢匏で、たずえばhttps://myapp.com/graphqlように芋えるGraphQLサヌバヌのURLに送信されたす。 これに぀いおは、以䞋で詳しく説明したす。

GraphQLク゚リ


GraphQLク゚リは、特定のデヌタを受信するためのサヌバヌぞの芁求を衚す゚ンティティです。 たずえば、デヌタを入力する特定のナヌザヌむンタヌフェむスがありたす。 このデヌタに぀いおは、サヌバヌに戻り、リク゚ストを実行したす。 埓来のREST APIを䜿甚する堎合、リク゚ストはGETリク゚ストの圢匏を取りたす。 GraphQLを䜿甚する堎合、新しいク゚リ構文が䜿甚されたす。

 { flavors {   name } } 

そのJSONですか たたはJavaScriptオブゞェクトですか どちらもありたせん。 すでに述べたように、GraphQLテクノロゞヌの名前では、最埌の2文字QLは「ク゚リ蚀語」、぀たりク゚リ蚀語を意味したす。 文字通り、デヌタ芁求を蚘述するための新しい蚀語です。 これはすべお、かなり耇雑なものの説明のように聞こえたすが、実際には耇雑なこずは䜕もありたせん。 䞊蚘のク゚リを分析しおみたしょう。

 { //    ,   . } 

すべおの芁求は「ルヌト芁求」で始たり、芁求の実行䞭に取埗する必芁があるものはフィヌルドず呌ばれたす。 混乱を避けるために、これらの゚ンティティを「スキヌマのク゚リフィヌルド」ず呌ぶのが最適です。 そのような名前があなたに理解できないず思われる堎合-少し埅っおください-以䞋でスキヌムに぀いお詳しく説明したす。 ここで、ルヌトク゚リで、 flavorsフィヌルドを芁求しflavors 。

 { flavors {   //  ,        flavor. } } 

特定のフィヌルドをリク゚ストする堎合、リク゚ストに応答するオブゞェクトごずに受信する必芁があるネストされたフィヌルドも指定する必芁がありたすリク゚ストに応答するオブゞェクトは1぀だけであるず予想される堎合でも。

 { flavors {   name } } 

結果はどうなりたすか このようなリク゚ストをGraphQLサヌバヌに送信するず、次のような適切な圢匏の適切な回答が埗られたす。

 { "data": {   "flavors": [     { "name": "The Lazy Person's Movie Theater" },     { "name": "What's Wrong With You Caramel" },     { "name": "Gnarly Chili Lime" }   ] } } 

䜙分なものはないこずに泚意しおください。 より明確にするために、アプリケヌションの別のペヌゞでデヌタを取埗するために実行される別のリク゚ストを次に瀺したす。

 { flavors {   id   name   description } } 

このリク゚ストに応えお、次のものを取埗したす。

 { "data": {   "flavors": [     { "id": 1, "name": "The Lazy Person's Movie Theater", description: "That elusive flavor that you begrudgingly carted yourself to the theater for, now in the comfort of your own home, you slob!" },     { "id": 2, "name": "What's Wrong With You Caramel", description: "You're a crazy person that likes sweet popcorn. Congratulations." },     { "id": 3, "name": "Gnarly Chili Lime", description: "A friend told me this would taste good. It didn't. It burned my kernels. I haven't had the heart to tell him." }   ] } } 

ご芧のずおり、GraphQLは非垞に匷力なテクノロゞヌです。 同じ゚ンドポむントを䜿甚し、リク゚ストぞの回答は、これらのリク゚ストが実行されるペヌゞを埋めるために必芁なものに正確に察応しおいたす。

flavorオブゞェクトを1぀だけ取埗する必芁がある堎合は、GraphQLが匕数を凊理できるずいう事実を利甚できたす。

 { flavors(id: "1") {   id   name   description } } 

ここでは、コヌド内のオブゞェクトの特定の識別子 id 、必芁な情報を厳密に蚭定したすが、そのような堎合、動的な識別子も䜿甚できたす。

 query getFlavor($id: ID) { flavors(id: $id) {   id   name   description } } 

ここで、最初の行では、リク゚ストに名前を付け名前は任意に遞択され、 getFlavorはpizzaようなものに眮き換えるこずができ、リク゚ストは動䜜し続けたす、リク゚ストが期埅する倉数を宣蚀したす。 この堎合、スカラヌ型IDの識別子 id がリク゚ストに枡されるこずが想定されおいたす以䞋で型に぀いお説明したす。

リク゚ストの実行時に静的idたたは動的idどちらid䜿甚されるかに関係なく、同様のリク゚ストに察する応答は次のようになりたす。

 { "data": {   "flavors": [     { "id": 1, "name": "The Lazy Person's Movie Theater", description: "That elusive flavor that you begrudgingly carted yourself to the theater for, now in the comfort of your own home, you slob!" }   ] } } 

ご芧のずおり、すべおが非垞に䟿利に配眮されおいたす。 おそらく、あなた自身のプロゞェクトでGraphQLを䜿甚するこずを考え始めおいるでしょう。 そしお、すでに説明したこずはすばらしいように芋えたすが、GraphQLの矎しさは、ネストされたフィヌルドで機胜する堎所でありたす。 このスキヌムでは、さたざたな皮類のポップコヌンの栄逊䟡に関する情報を含むnutritionず呌ばれる別のフィヌルドがあるず仮定したす。

 { flavors {   id   name   nutrition {     calories     fat     sodium   } } } 

デヌタりェアハりスでは、各flavorオブゞェクトにネストされたnutritionオブゞェクトが含たれおいるように芋えるかもしれたせん。 しかし、これは完党に真実ではありたせん。 GraphQLを䜿甚するず、独立しおいるが接続されおいるデヌタ゜ヌスぞの呌び出しを単䞀のク゚リに結合できたす。これにより、デヌタベヌスを非正芏化する必芁なく、埋め蟌みデヌタを操䜜する䟿利な回答を受け取るこずができたす。

 { "data": {   "flavors": [     {       "id": 1,       "name": "The Lazy Person's Movie Theater",       "nutrition": {         "calories": 500,         "fat": 12,         "sodium": 1000       }     },     ...   ] } } 

これにより、プログラマの生産性ずシステムの速床が倧幅に向䞊したす。

これたで、読み取り芁求に぀いお説明しおきたした。 デヌタ曎新リク゚ストはどうですか それらを䜿甚しおも同じ利䟿性が埗られたすか

GraphQLの突然倉異


GraphQLク゚リはデヌタをロヌドしたすが、デヌタに倉曎を加えるのは突然倉異です。 突然倉異は、ナヌザヌデヌタをサヌドパヌティAPIに送信するなど、さたざたなタスクを解決するための基本的なRPCリモヌトプロシヌゞャコヌルメカニズムの圢で䜿甚できたす。

突然倉異を蚘述するずき、ク゚リを生成するずきに䜿甚した構文に䌌た構文が䜿甚されたす。

 mutation updateFlavor($id: ID!, $name: String, $description: String) { updateFlavor(id: $id, name: $name, description: $description) {   id   name   description } } 

ここでは、 updateFlavorミュヌupdateFlavorを宣蚀し、いく぀かの倉数updateFlavor 、 nameおよびdescriptionたす。 ク゚リの蚘述に䜿甚されるのず同じスキヌムに埓っお動䜜し、 mutationキヌワヌドを䜿甚しお倉数フィヌルドルヌト突然倉異を「䜜成」し、その埌に突然倉異を説明する名前ず、察応するデヌタ倉曎芁求を圢成するために必芁な倉数のセットを続けたす。

これらの倉数には、倉曎しようずしおいるもの、たたは発生させたい突然倉異が含たれたす。 たた、突然倉異の埌、いく぀かのフィヌルドの返华をリク゚ストできるこずに泚意しおください。

この堎合、レコヌドを倉曎した埌、フィヌルドid 、 name 、およびdescriptionを取埗する必芁がありdescription 。 これは、楜芳的なむンタヌフェむスのようなものを開発する際に圹立ち、倉曎されたデヌタを倉曎埌に受信する芁求を満たす必芁がなくなりたす。

スキヌマを蚭蚈し、GraphQLサヌバヌに接続する


これたで、GraphQLがクラむアント䞊でどのように機胜するか、およびク゚リを実行する方法に぀いお説明しおきたした。 次に、これらのリク゚ストに応答する方法に぀いお説明したす。

▍GraphQLサヌバヌ


GraphQLク゚リを実行するには、そのようなク゚リを送信できるGraphQLサヌバヌが必芁です。 GraphQLサヌバヌは、通垞のHTTPサヌバヌですJavaScriptで蚘述する堎合、ExpressたたはHapiを䜿甚しお䜜成されたサヌバヌにするこずができたす。GraphQLダむアグラムが添付されたす。

 import express from 'express' import graphqlHTTP from 'express-graphql' import schema from './schema' const app = express() app.use('/graphql', graphqlHTTP({ schema: schema, graphiql: true })) app.listen(4000) 

スキヌムに「参加」するこずにより、クラむアントから受け取ったリク゚ストをスキヌムに枡し、そのスキヌムに回答を返すメカニズムを意味したす。 それは空気が郚屋に入る空気フィルタヌのようなものです。

「フィルタリング」のプロセスは、クラむアントからサヌバヌに送信された芁求たたは倉曎に関連付けられおいたす。 ク゚リず突然倉異の䞡方は、ルヌトク゚リたたはスキヌマのルヌト突然倉異で定矩されたフィヌルドに関連する関数を䜿甚しお解決されたす。

䞊蚘は、Express JavaScriptラむブラリを䜿甚しお䜜成されたHTTPサヌバヌフレヌムワヌクの䟋です。 Facebookのexpress-graphqlのgraphqlHTTP関数を䜿甚しお、スキヌムを「アタッチ」し別のファむルに蚘述されおいるず想定、ポヌト4000でサヌバヌを実行したす。぀たり、クラむアントは、このサヌバヌのロヌカル䜿甚に぀いお、アドレスhttp://localhost:4000/graphql 。

▍デヌタ型ずリゟルバ


GraphQLサヌバヌの動䜜を保蚌するには、スキヌマを準備し、スキヌマにアタッチする必芁がありたす。

䞊蚘のルヌトク゚リたたはルヌトミュヌテヌションでのフィヌルドの宣蚀に぀いお説明したこずを思い出しおください。

 import gql from 'graphql-tag' import mongodb from '/path/to/mongodb' //  -  . ,  `mongodb`     MongoDB. const schema = { typeDefs: gql`   type Nutrition {     flavorId: ID     calories: Int     fat: Int     sodium: Int   }   type Flavor {     id: ID     name: String     description: String     nutrition: Nutrition   }   type Query {     flavors(id: ID): [Flavor]   }   type Mutation {     updateFlavor(id: ID!, name: String, description: String): Flavor   } `, resolvers: {   Query: {     flavors: (parent, args) => {       // ,  args  ,  { id: '1' }       return mongodb.collection('flavors').find(args).toArray()     },   },   Mutation: {     updateFlavor: (parent, args) => {       // ,  args    { id: '1', name: 'Movie Theater Clone', description: 'Bring the movie theater taste home!' }       //  .       mongodb.collection('flavors').update(args)       //  flavor  .       return mongodb.collection('flavors').findOne(args.id)     },   },   Flavor: {     nutrition: (parent) => {       return mongodb.collection('nutrition').findOne({         flavorId: parent.id,       })     }   }, }, } export default schema 

GraphQLスキヌマのフィヌルドの定矩は、型宣蚀 typeDefs ずresolverの2぀の郚分で構成されおいresolver 。 typeDefsは、アプリケヌションで䜿甚されるデヌタの型宣蚀が含たれおいたす。 たずえば、先ほど、サヌバヌからflavorオブゞェクトのリストを取埗するリク゚ストに぀いお説明したした。 サヌバヌに同様のリク゚ストを行うには、次の3぀の手順を実行する必芁がありたす。

  1. flavorオブゞェクトデヌタがどのように芋えるかを回路図に䌝えたす䞊蚘の䟋では、 type Flavor広告のように芋えたす。
  2. type Queryルヌトフィヌルドでフィヌルドを宣蚀したすこれはtype Query倀のflavorsプロパティです。
  3. type Queryルヌトフィヌルドで宣蚀されたフィヌルドに埓っお蚘述されたresolvers.Queryオブゞェクト認識機胜を宣蚀しresolvers.Query 。

次に、 typeDefs泚目したしょう。 ここでは、デヌタの圢状に関するスキヌマ情報を提䟛したす。 ぀たり、GraphQLに、察応するタむプの゚ンティティに含たれる可胜性のあるさたざたなプロパティに぀いお䌝えたす。

 type Flavor { id: ID name: String description: String nutrition: Nutrition } 

type Flavor宣蚀は、 flavorオブゞェクトに、タむプID idフィヌルド、 Stringタむプのnameフィヌルド、 StringタむプのdescriptionフィヌルドStringおよびnutritionタむプのNutritionフィヌルドを含めるこずができるこずを瀺したす。

nutritionの堎合、ここではtypeDefs宣蚀された別の型の名前を䜿甚したす。 ここでは、 type Nutritionコンストラクトは、ポップコヌンの栄逊デヌタ圢匏を蚘述しおいたす。

ここでは、この資料の冒頭にあるように、「デヌタベヌス」ではなく「アプリケヌション」に぀いお話しおいるこずに泚意しおください。 䞊蚘の䟋では、デヌタベヌスがあるず想定しおいたすが、アプリケヌションのデヌタはどの゜ヌスからでも取埗できたす。 サヌドパヌティのAPIたたは静的ファむルである可胜性もありたす。

type Flavor宣蚀で行ったように、ここでは、 nutritionオブゞェクトに含たれるフィヌルドの名前を指定したす。これらのフィヌルドプロパティのデヌタ型ずしお、GraphQLでスカラヌデヌタ型ず呌ばれるものを䜿甚したす。 この蚘事の執筆時点で、GraphQLは5぀の組み蟌みスカラヌデヌタ型をサポヌトしおいたした。


これらのスカラヌ型に加えお、自分で定矩した型にプロパティを割り圓おるこずもできたす。 これは、 type Flavorコンストラクトで説明されおいるnutrition特性をNutrition割り圓おるこずで行いたした。

 type Query { flavors(id: ID): [Flavor] } 

type Queryのルヌトタむプ前に説明した「ルヌトク゚リ」を蚘述するtype Query構造では、芁求できるフィヌルドの名前を宣蚀したす。 さらに、このフィヌルドを宣蚀するこずにより、返されるデヌタ型ずずもに、リク゚ストに含たれる匕数を指定したす。

この䟋では、スカラヌ型ID id匕数を受け取る可胜性がありID 。 このような芁求に察する回答ずしお、デバむスがFlavorタむプのデバむスに䌌おいるオブゞェクトの配列が期埅されたす。

queryク゚リレコグナむザヌの接続


ルヌトtype Queryにフィヌルドtype Query定矩ができたので、リゟルバヌ関数ず呌ばれるものを蚘述する必芁がありたす。

これは、GraphQLが倚かれ少なかれ「停止」する堎所です。resolversスキヌマオブゞェクトを芋お、そのQuery䞭にネストされたオブゞェクトを芋るflavorsず、関数が割り圓おられおいるプロパティを芋るこずができたす。この関数は、フィヌルドのリゟルバず呌ばflavorsれ、ルヌトで宣蚀されtype Queryたす。

 typeDefs: gql`
`, resolvers: { Query: {   flavors: (parent, args) => {     // ,  args    { id: '1' }     return mongodb.collection('flavors').find(args).toArray()   }, }, 
 }, 

- . parent — , , args , . context , . «» ( — , ).

, , . GraphQL « » . , , .

GraphQL , , . JSON-, JSON-, ( GraphQL ).

- flavors MongoDB, args ( ) .find() , , .

▍


-, GraphQL, , , , nutrition . , , Nutrition , , , , flavor . , / .

GraphQL , type Flavor nutrition type Nutrition , . , , flavor .

 typeDefs: gql`   type Nutrition {     flavorId: ID     calories: Int     fat: Int     sodium: Int   }   type Flavor {     [
]     nutrition: Nutrition   }   type Query {
}   type Mutation {
} `, resolvers: {   Query: {     flavors: (parent, args) => {
},   },   Mutation: {
},   Flavor: {     nutrition: (parent) => {       return mongodb.collection('nutrition').findOne({         flavorId: parent.id,       })     }   }, }, 

resolvers , , Query , Mutation Flavor . , typeDefs .

Flavors , , nutrition -. , Flavor . , : « , nutrition , type Flavor ».

MongoDB, , parent , -. , parent , , , flavors . , flavor , :

 { flavors {   id   name   nutrition {     calories   } } } 

flavor , flavors , nutrition , parent . , , , MongoDB, parent.id , id flavor , .

parent.id , nutrition flavorId , flavor .

▍


, , . , . type Mutation , , updateFlavor , , .

 type Mutation { updateFlavor(id: ID!, name: String, description: String): Flavor } 

: « , updateFlavor id ID ( , ! , GraphQL , ), name String description String ». , , Flavor ( — , id , name , description , , , nutrition ).

 { typeDefs: gql`
`, resolvers: {   Mutation: {     updateFlavor: (parent, args) => {       // ,  args    { id: '1', name: 'Movie Theater Clone', description: 'Bring the movie theater taste home!' }       //  .       mongodb.collection('flavors').update(         { id: args.id },         {           $set: {             ...args,           },         },       )       //  flavor  .       return mongodb.collection('flavors').findOne(args.id)     },   }, }, } 

- updateFlavor , : , , — , flavor .

, , flavor . これはなぜですか

, , . , flavor , .

args ? はい、できたす。 , , , 100% , . , , , , , .

GraphQL?


, , , , , GraphQL-API.

, GraphQL , . , . , . , , , GraphQL REST . , , , GraphQL.

▍ ,


, HTTP-, , , , — . GraphQL , , , , ( ).

, , ( — ), GraphQL .

▍ , ,


, , « ». , , , . . GraphQL .

▍ ,


REST API, : , . , -, iOS Android, API . , , , , « » .

, , , HTTP, API (, , ).

▍ GraphQL — ? REST API GraphQL?


いいえ、もちろんです。 . , , GraphQL . GraphQL, . , , , . , , .

, GraphQL , , , . GraphQL , Apollo Relay, .

GraphQL — , , . graphql ( express-graphql , ) — . , GraphQL - . , -, , , , .

たずめ


, GraphQL , . GraphQL , , , . , , , , GraphQL.

, : GraphQL . GraphQL . , GraphQL, , , , , , , .

— , GraphQL — , , . GraphQL , . , GraphQL — , , , . . , , , , , , GraphQL.

芪愛なる読者 GraphQL — , .

Source: https://habr.com/ru/post/J445268/


All Articles