graphql-http
と組み合わせて任意のExpressミドルウェアを使用するのは簡単です。特に、これは認証を処理するための優れたパターンです。
GraphQLリゾルバーでミドルウェアを使用するには、通常のExpressアプリと同様にミドルウェアを使用するだけです。その後、request
オブジェクトは任意のリゾルバーの2番目の引数として利用可能になります。
たとえば、すべてのリクエストのIPアドレスをサーバーにログ記録し、呼び出し元のIPアドレスを返すAPIも書きたいとします。 前者はミドルウェアで、後者はリゾルバー内のrequest
オブジェクトにアクセスすることで実行できます。これを実装するサーバーコードを以下に示します。
var express = require("express")var { createHandler } = require("graphql-http/lib/use/express")var { buildSchema } = require("graphql")
var schema = buildSchema(` type Query { ip: String }`)
const loggingMiddleware = (req, res, next) => { console.log("ip:", req.ip) next()}
var root = { ip: function (args, request) { return request.ip },}
var app = express()app.use(loggingMiddleware)app.all( "/graphql", createHandler({ schema: schema, rootValue: root, graphiql: true, }))app.listen(4000)console.log("Running a GraphQL API server at localhost:4000/graphql")
REST APIでは、認証は多くの場合、リクエストを行っているユーザーを証明する認証トークンを含むヘッダーで処理されます。Expressミドルウェアはこれらのヘッダーを処理し、認証データをExpressのrequest
オブジェクトに配置します。 このような認証を処理するミドルウェアモジュールには、Passport、express-jwt、express-sessionなどがあります。これらの各モジュールはgraphql-http
で動作します。
これらの認証メカニズムに慣れていない場合は、将来の柔軟性を犠牲にすることなく簡単なため、express-jwt
を使用することをお勧めします。
この時点までドキュメントを順を追って読んだのであれば、おめでとうございます!これで、実用的なGraphQL APIサーバーを構築するために必要なすべてを知ることができました。