GraphQL服务器的组成要素

由于使用了Next.js + 服务器端TypeScript + 函数风格,我创建了一个干净的应用程序,因此在2022年的 Advent Calendar 的第12天,我想要写一些实现意图等内容。我是在mofmof公司工作的shwld。

昨天写了关于仓库层的内容。

構成GraphQL服务器的组成要素

GraphQL的服务器端实现主要是使用@graphql-codegen和The Guild的许多工具进行实现。
虽然我们正在尝试各种方法,但我还没有找到这个是最好的!这让我有些试验性的感觉。

使用的软件包如下。

下一个.js

这是一个用于在Next.js的API路由中使用的软件包。

GraphQL瑜伽

这是一个GraphQL服务器。服务端本身使用了Next.js的API路由,不使用其他库比如fastify。

GraphQL Envelop (GraphQL 信封)

我正在使用Yoga进行扩展。
我正在使用Yoga来实现Context和Logger等功能。

GraphQL 解析器

GraphQL的解析器与Next.js分层分离。
此外,业务层不被分割,将GraphQL解析器视为业务层。
以下是用于创建解析器的软件包。

@envelop/通用认证

    • コンテキストとして受け取ったユーザーを認証する

 

    ユーザーが存在しない場合にどうするかなどまだ、ちゃんと設定できてない

@graphql-codegen -> GraphQL 代码生成

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

为了结构化和模块化整理,我们也尝试了GraphQL模块,但由于它使用fs来导入文件的规格,我们不喜欢这种方式,所以没有使用它。

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

祖德

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

GraphQL Shield(图灵机器人)

    • これでやっているのはログインしてるかどうかのチェックのみで、細かい認可制御は別でやっています

 

    これいらないかもなーとか思ったりしなくもない。理由はGraphQL Middlewareの項で

GraphQL中间件

    • GraphQLShieldを利用するために使っています。

 

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

 

    はがそうかなーと思っています。

graphql-relay

GraphQL-Relay (GraphQL中继)

    • relay styleのページネーションを実装するためだけに使っています。

 

    後日このカレンダーで記事にします。

下次告知

明天,我将写关于GraphQL解析器目录结构的内容。

bannerAds