Cheat Sheet速查表
跳转到主要内容

Absinthe 速查表

Absinthe 允许您使用 Elixir 编写 GraphQL 服务器。

简介

概念

  • Schema - 根(Root)。定义了您可以执行哪些查询,以及这些查询返回什么类型的数据。
  • Resolver - 返回数据的函数。
  • Type - 类型定义,描述了所返回数据的结构(形态)。

Plug

web/router.ex

defmodule Blog.Web.Router do
  use Phoenix.Router

  forward "/", Absinthe.Plug,
    schema: Blog.Schema
end

Absinthe 是一个 Plug,你需要向其传入一个参数 Schema(模式).

参见: 我们的第一个查询 (Query)

核心概念

Schema(模式)

web/schema.ex

defmodule Blog.Schema do
  use Absinthe.Schema
  import_types Blog.Schema.Types

  query do
    @desc "Get a list of blog posts"
    field :posts, list_of(:post) do
      resolve &Blog.PostResolver.all/2
    end
  end
end

此 Schema 将负责处理 { posts { ··· } }。它返回一个 类型 (Type) ,属于 :post,并将任务委托给 解析器 (Resolver).

解析器 (Resolver)

web/resolvers/post_resolver.ex

defmodule Blog.PostResolver do
  def all(_args, _info) do
    {:ok, Blog.Repo.all(Blog.Post)}
  end
end

这是 Schema 将查询委托给的 posts 函数。

类型 (Type)

web/schema/types.ex

defmodule Blog.Schema.Types do
  use Absinthe.Schema.Notation

  @desc "A blog post"
  object :post do
    field :id, :id
    field :title, :string
    field :body, :string
  end
end

这里定义了一个类型 :post,供解析器 (Resolver) 使用。

Schema(模式)

查询参数 (Query arguments)

GraphQL 查询

{ user(id: "1") { ··· } }

web/schema.ex

query do
  field :user, type: :user do
    arg :id, non_null(:id)
    resolve &Blog.UserResolver.find/2
  end
end

解析器 (Resolver)

def find(%{id: id} = args, _info) do
  ···
end

参见: 查询参数 (Query arguments)

变更 (Mutations)

GraphQL 查询

{
  mutation CreatePost {
    post(title: "Hello") { id }
  }
}

web/schema.ex

mutation do
  @desc "Create a post"
  field :post, type: :post do
    arg :title, non_null(:string)
    resolve &Blog.PostResolver.create/2
  end
end

参见: 变更 (Mutations)

参考资料