《Elixir × GraphQL系列①》〜轻松搭建GraphQL服务器〜

圣水 × 图灵通信系列

~ 百蘭酒設定 ~

此篇文章是「Elixir Advent Calendar 2022」第八天的文章。
我是YOSUKE,目前在东京但是来自福冈ex。

由于我之前已经写过Graphql的设置,所以这次我会简单地写出步骤。以简洁的方式进行说明。

这个系列我打算做成三部曲。

mix phx.new open_data_ql
mix phx.gen.context Community Place places name:string location:string lat:float lon:float scale:integer

执行

mix ecto.create
mix ecto.migrate

添加依赖关系

defp deps do
    [
    # 省略 #
      {:absinthe, "~> 1.7"},
      {:absinthe_plug, "~> 1.5"},
      {:absinthe_phoenix, "~> 2.0"}
    ]
end

执行

mix deps.get

准备样本数据

alias OpenDataQl.Repo
alias OpenDataQl.Community.Place

%Place{
  name: "test1",
  location: "test1",
  lat: 123.45,
  lon: 67.89,
  scale: 1
} |> Repo.insert!

%Place{
  name: "test2",
  location: "test2",
  lat: 223.45,
  lon: 67.89,
  scale: 2
} |> Repo.insert!

%Place{
  name: "test3",
  location: "test3",
  lat: 323.45,
  lon: 67.89,
  scale: 3
} |> Repo.insert!

创建模式


defmodule OpenDataQlWeb.Schema.Schema do
  use Absinthe.Schema

  object :place do
    field :id, non_null(:id)
    field :name, non_null(:string)
    field :location, non_null(:string)
    field :lat, non_null(:float)
    field :lon, non_null(:float)
    field :scale, non_null(:integer)
  end

  query do
    @desc "Get a list of places"
    field :places, list_of(:place) do
      resolve &OpenDataQlWeb.Resolvers.Community.places/3
    end

    @desc "Get a place by its id"
    field :place, :place do
      arg :id, non_null(:id)
      resolve &OpenDataQlWeb.Resolvers.Community.place/3
    end
  end

end

创建解析器

defmodule OpenDataQlWeb.Resolvers.Community do
  alias OpenDataQl.Community

  def places(_, _, _) do
    {:ok, Community.list_places()}
  end

  def place(_, %{id: id}, _) do
    {:ok, Community.get_place!(id)}
  end
end

在路由器上做追加记录

defmodule OpenDataQlWeb.Router do
  use OpenDataQlWeb, :router

# 省略 #

  pipeline :api do
    plug :accepts, ["json"]
  end

  scope "/api" do
    pipe_through :api

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

# 省略 #

  if Mix.env() == :dev do
    forward "/graphiql", Absinthe.Plug.GraphiQL,
      schema: OpenDataQlWeb.Schema.Schema,
      interface: :simple
  end
end

开动

iex -S mix phx.server

访问

http://localhost:4000/图形界面查询语言

スクリーンショット 2022-12-04 14.30.17.png

好了,既然到这一步完成了,下一步我们就用Elixir来制作客户端吧。

广告
将在 10 秒后关闭
bannerAds