1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Next.js + サーバーサイドTypeScript + 関数フレーバーでクリーンなアプリを作ったので実装意図とか書く Advent Calendar 2022
12日目株式会社mofmofに生息しているshwldです。

前日はリポジトリ層について書きました

GraphQLサーバーを構成する要素

GraphQLのサーバーサイド実装は @graphql-codegenをメインにThe Guildのツールを多数使って実装しています。
いろいろ試していますがまだ、これがいい!みたいなのは自分の中で見つかっておらず、experimentalな感じです。

利用しているパッケージは以下。

Next.js配下

Next.jsのapiルートで使うためのパッケージです。

GraphQL Yoga

GraphQLサーバーです。サーバー自体はNext.jsのAPIルートを使っておりfastifyなど他のライブラリは使ってません。

GraphQL Envelop

Yogaを拡張するために使っています。
ContextやLoggerなどを使えるようにしています。

GraphQLリゾルバ

GraphQLのリゾルバはNext.jsとはレイヤーを分けています。
また、ユースケース層は分けず、GraphQLリゾルバをユースケース層として扱っています。
リゾルバーを作るために使っているパッケージは以下です。

@envelop/generic-auth

  • コンテキストとして受け取ったユーザーを認証する
  • ユーザーが存在しない場合にどうするかなどまだ、ちゃんと設定できてない

@graphql-codegen

  • GraphQLのschemaからリゾルバの型を生成するために使っています

構造化とモジュール整理のためにGraphQL Modulesも試しましたが、こちらはfsを使ってファイルを引いて来るみたいな仕様が嫌で使っていません。

/advent-calendar/use-cases/graphql-resolvers/src/index.ts
const executableSchema = makeExecutableSchema<GraphqlServerContext>({
  typeDefs,
  resolvers: merge.all<Resolvers<GraphqlServerContext>>([
    userProfileModule.resolvers,
    storyModule.resolvers,
    projectModule.resolvers,
    accountModule.resolvers,
    viewerModule.resolvers,
  ]),
});

/advent-calendar/use-cases/graphql-resolvers/src/index.ts

zod

  • バリデーションライブラリ

GraphQL Shield

  • これでやっているのはログインしてるかどうかのチェックのみで、細かい認可制御は別でやっています
  • これいらないかもなーとか思ったりしなくもない。理由はGraphQL Middlewareの項で

GraphQL Middleware

  • GraphQLShieldを利用するために使っています。
  • Middlewareを使うとレイヤー化を促進しますが、個人的にはGraphQL全体を責務でスライスするよりも、feature単位でスライスしたくて、あんまり好みとは合わない気がしています。
  • はがそうかなーと思っています。

graphql-relay

  • relay styleのページネーションを実装するためだけに使っています。
  • 後日このカレンダーで記事にします。

次回予告

明日は、GraphQLリゾルバのディレクトリ構造について書きます

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?