最初に行うことは、Expressフレームワークを使用してnode.jsサーバーを作成することです。また、MongodbとMongooseを使用してデータの持続性を使用し、BabelはES6を使用します。コードは実行時にES5に輸送されるため、ビルドプロセスは必要ありません。これはindex.js:で行われます<span>// index.js
</span><span>require('babel/register');
</span><span>require('./app');
</span>
<span>// app.js </span><span>import express from 'express'; </span><span>import graphqlHTTP from 'express-graphql'; </span><span>import mongoose from 'mongoose'; </span> <span>import schema from './graphql'; </span> <span>var app = express(); </span> <span>// GraphqQL server route </span>app<span>.use('/graphql', graphqlHTTP(req => ({ </span> schema<span>, </span> <span>pretty: true </span><span>}))); </span> <span>// Connect mongo database </span>mongoose<span>.connect('mongodb://localhost/graphql'); </span> <span>// start server </span><span>var server = app.listen(8080, () => { </span> <span>console.log('Listening at port', server.address().port); </span><span>}); </span>
GraphQLがリクエストを理解するには、スキーマを定義する必要があります。そして、GraphQLスキーマは、クエリと突然変異のグループに他なりません。クエリは、データベースから取得して、データベースへのあらゆる種類の更新として変異を取得するためのリソースと考えることができます。例として、ブログポストとコメントマングースモデルを作成し、その後、いくつかのクエリと突然変異を作成します。
mongooseモデルgraphqlタイプ
あなたは許可されているものを制御します。これにより、システムセキュリティが向上します許可されているものを制御します。これは、特定のフィールドを定義して、取得することを許可されないことを意味します。たとえば、パスワードまたはその他の機密データ
フィールドに通過するクエリと変異変数は、単純なJavaScriptオブジェクトです。キーは、突然変異名またはクエリ名です。値は、GraphQLにそれらをどうするかを伝える構成を備えた単純なJavaScriptオブジェクトです。次のGraphQLクエリを例として見てみましょう
grahpqlについては、このクエリで何をすべきかを理解するには、ブログ投稿とコメントクエリを定義する必要があります。したがって、私たちのクエリ変数は次のようなものになります:
<span>// index.js </span><span>require('babel/register'); </span><span>require('./app'); </span>
変異についても同じことが言えます。これは、クエリまたは突然変異にあるキーとクエリに入れた名前の間に直接的な関係があることを説明するためです。次に、これらのクエリと突然変異のそれぞれがどのように定義されているかを見てみましょう。
<span>// app.js </span><span>import express from 'express'; </span><span>import graphqlHTTP from 'express-graphql'; </span><span>import mongoose from 'mongoose'; </span> <span>import schema from './graphql'; </span> <span>var app = express(); </span> <span>// GraphqQL server route </span>app<span>.use('/graphql', graphqlHTTP(req => ({ </span> schema<span>, </span> <span>pretty: true </span><span>}))); </span> <span>// Connect mongo database </span>mongoose<span>.connect('mongodb://localhost/graphql'); </span> <span>// start server </span><span>var server = app.listen(8080, () => { </span> <span>console.log('Listening at port', server.address().port); </span><span>}); </span>
クエリから始めて、これまでに作成したモデルを使用して、例からピックアップしましょう。良い例は、ブログ投稿とそのすべてのコメントを取得することです。
graphqlでは、次のクエリを使用して、1つのHTTPリクエストでのみこれを作成できます。
1つのリクエストで必要なすべてのデータを取得できます。これだけでパフォーマンスが向上します。また、使用する正確なプロパティを要求することもできます。上記の例では、応答はブログ投稿のタイトルと説明のみをもたらすだけであり、コメントはテキストのみをもたらすだけです。
各リソースから必要なフィールドのみを取得すると、Webページまたはアプリケーションの読み込み時間に大きな影響を与える可能性があります。たとえば、コメントを見てみましょう。コメントには、_idとpostidプロパティもあります。これらのそれぞれは、それぞれ正確には12バイトで、12バイトです(オブジェクトキーではカウントされません)。これは、単一またはいくつかのコメントである場合、ほとんど影響を与えません。たとえば、200のコメントについて話しているとき、それは4800バイトを超えていません。そして、それはアプリケーションの読み込み時間に大きな違いをもたらす可能性があります。これは、通常、ネットワーク接続が遅いモバイルのリソースなど、リソースが限られているデバイスにとって特に重要です。 これが機能するためには、特定のクエリごとにデータを取得する方法をGraphQLに伝える必要があります。クエリ定義の例を見てみましょう:<span>// graphql/types/blog-post.js </span><span>import <span>{ </span></span><span> <span>GraphQLObjectType, </span></span><span> <span>GraphQLNonNull, </span></span><span> <span>GraphQLString, </span></span><span> <span>GraphQLID </span></span><span><span>}</span> from 'graphql'; </span> <span>export default new GraphQLObjectType({ </span> <span>name: 'BlogPost', </span> <span>fields: { </span> <span>_id: { </span> <span>type: new GraphQLNonNull(GraphQLID) </span> <span>}, </span> <span>title: { </span> <span>type: GraphQLString </span> <span>}, </span> <span>description: { </span> <span>type: GraphQLString </span> <span>} </span> <span>} </span><span>}); </span>
<span>// index.js </span><span>require('babel/register'); </span><span>require('./app'); </span>
ここでは、IDパラメーターに基づいて単一のブログ投稿を取得するクエリを作成しています。クエリの出力を検証する以前に作成したタイプを指定していることに注意してください。また、このクエリに必要なargumentsを使用してARGSオブジェクトを設定しています。そして最後に、データベースを照会してデータを返す解決関数。
データの取得プロセスをさらに最適化し、MongoDBの投影機能を活用するために、GraphQLがMongooseと互換性のある投影を生成するために提供するASTを処理しています。したがって、次のクエリを作成した場合:
<span>// app.js </span><span>import express from 'express'; </span><span>import graphqlHTTP from 'express-graphql'; </span><span>import mongoose from 'mongoose'; </span> <span>import schema from './graphql'; </span> <span>var app = express(); </span> <span>// GraphqQL server route </span>app<span>.use('/graphql', graphqlHTTP(req => ({ </span> schema<span>, </span> <span>pretty: true </span><span>}))); </span> <span>// Connect mongo database </span>mongoose<span>.connect('mongodb://localhost/graphql'); </span> <span>// start server </span><span>var server = app.listen(8080, () => { </span> <span>console.log('Listening at port', server.address().port); </span><span>}); </span>
<span>// graphql/types/blog-post.js </span><span>import <span>{ </span></span><span> <span>GraphQLObjectType, </span></span><span> <span>GraphQLNonNull, </span></span><span> <span>GraphQLString, </span></span><span> <span>GraphQLID </span></span><span><span>}</span> from 'graphql'; </span> <span>export default new GraphQLObjectType({ </span> <span>name: 'BlogPost', </span> <span>fields: { </span> <span>_id: { </span> <span>type: new GraphQLNonNull(GraphQLID) </span> <span>}, </span> <span>title: { </span> <span>type: GraphQLString </span> <span>}, </span> <span>description: { </span> <span>type: GraphQLString </span> <span>} </span> <span>} </span><span>}); </span>
突然変異
graphqlを使用すると、次のようなものを使用して1つのHTTPリクエストでのみ実行できます。
<span>// graphql/index.js </span><span>import <span>{ </span></span><span> <span>GraphQLObjectType, </span></span><span> <span>GraphQLSchema </span></span><span><span>}</span> from 'graphql'; </span> <span>import mutations from './mutations'; </span><span>import queries from './queries'; </span> <span>export default new GraphQLSchema({ </span> <span>query: new GraphQLObjectType({ </span> <span>name: 'Query', </span> <span>fields: queries </span> <span>}), </span> <span>mutation: new GraphQLObjectType({ </span> <span>name: 'Mutation', </span> <span>fields: mutations </span> <span>}) </span><span>}); </span>
クエリと突然変異の構文はまったく同じであり、突然変異にクエリを変更するだけであることに注意してください。 クエリから行うのと同じように、突然変異からデータを尋ねることができます。 BlogPostCommentINCの上記のクエリにあるように、フラグメントを指定しないことで、操作を確認するのに十分な場合が多い真または誤った返品値を求めています。または、AddComment変異のようなデータを要求することもできます。これは、サーバーで生成されたデータのみを取得するのに役立ちます。
次に、サーバーの突然変異を定義しましょう。突然変異は、クエリとして正確に作成されます:query <span>{ </span> blogPosts <span>{ </span> _id<span>, </span> title <span>} </span> comments <span>{ </span> text <span>} </span><span>} </span>
この突然変異は、新しいブログ投稿を追加し、成功した場合にtrueを返します。タイプで、どのように返されるかを指定する方法に注意してください。 ARGSでは、突然変異から受けた議論。クエリ定義のように、Resolve()機能。 GraphQLエンドポイントのテスト
<span>{ </span> <span>blogPosts: {...}, </span> <span>comments: {...} </span><span>} </span>
次のような場所にGet Requestを送信または投稿する方法はたくさんあります。
これらの3つからGraphiQLをお勧めしますが、何よりも郵便配達員よりもお勧めします。このツールは間違いなくAPIテストの進歩です。あらゆるタイプのリクエストのコレクションを作成および保存できる直感的なインターフェイスを提供します。 APIのテストを作成して、ボタンをクリックして実行することもできます。また、共同機能があり、リクエストのコレクションを共有できます。そこで、ここからダウンロードできるものを作成しました。これを郵便配達員にインポートできます。郵便配達員がインストールされていない場合は、絶対にお勧めします。
サーバーを実行することから始めましょう。ノード4以下をインストールする必要があります。そうでない場合は、NVMを使用してインストールすることをお勧めします。その後、コマンドラインで以下を実行できます:
サーバーはリクエストを受信する準備ができたので、郵便配達員にいくつかを作成しましょう。 GraphQLルートは/graphQlに設定されているため、最初に行うことは、http:// localhost:8080/graphqlのリクエストを指示する場所に場所を設定することです。次に、GETまたはPOSTリクエストのかどうかを指定する必要があります。これらのいずれかを使用できますが、URLに影響を与えずにクリーナーにするため、投稿を好みます。また、リクエストに伴うヘッダーを構成する必要があります。この場合、Application/JSONに等しいコンテンツタイプを追加するだけです。ポストマンですべてのセットアップのように見える方法は次のとおりです
<span>// index.js </span><span>require('babel/register'); </span><span>require('./app'); </span>
以下のようなJSON形式で必要なGraphQLクエリと変数を持つボディを作成できるようになりました。
私が提供したコレクションをインポートしたと仮定すると、テストできるクエリと突然変異のリクエストが既にあるはずです。ハードコーディングされたMongo IDを使用しているため、リクエストを順番に実行すると、すべて成功する必要があります。私がそれぞれの体に入れたものを分析すると、この記事で議論されているものの単なるアプリケーションであることがわかります。また、最初のリクエストを複数回実行すると、複製IDになるため、エラーの返された方法がわかります。
GraphQLサーバーをテストするにはどうすればよいですか?エンドツーエンドテスト。 Jestのようなライブラリを使用して、テストを作成し、SuperTestのようなライブラリを使用して、HTTPリクエストをサーバーに作成できます。リソースバー、スキーマ、およびmongoDBクエリと突然変異をテストする必要があります。GraphQLサーバーを展開するにはどうすればよいですか? AWS、またはGoogleクラウド。また、展開プロセスを自動化するために、継続的な統合と継続的な展開(CI/CD)パイプラインを設定する必要があります。これは、GitHub ActionsやJenkinsなどのサービスを使用して実行できます。
graphqlを使用してファイルアップロードを処理するにはどうすればよいですか?
以上がnode.jsとmongodbを使用してGraphQL Serverを作成しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。