この記事は、「Elixir Advent Calendar 2019」の24日目になります。
「Elixir Advent Calendar 2019」23日目は、@sanpo_shihoさんのElixirで作るニューラルネットワークを用いた手書き数字認識①でした。
そしてこの記事は、「fukuoka.ex Elixir/Phoenix Advent Calendar 2019」の1日目から始まった3部作の3つ目の記事で、Advent Calendar NervesJP 6日目の続きになります。
東京だけど fukuoka.ex の YOSUKENAKAO.me です。
普段は合同会社The Waggleで「教育」に関わるサービス作りのお仕事と学習教材の開発や
研修講座の企画開発をしています。
この記事の構成
Advent Calendar fukuoka.ex 1日目
https://qiita.com/advent-calendar/2019/fukuokaex
GraphCMS から Absinthe を利用して作る Elixir で体験的に GraphQLSever を作る「ポエム」
Advent Calendar NervesJP 6日目
https://qiita.com/advent-calendar/2019/nervesjp
Nerves と GraphQLsever の組み合わせを考える「ポエム」
Advent Calendar Elixir 24日目
https://qiita.com/advent-calendar/2019/elixir
GraphCMS から入り、Absintheを利用して作って動かす「チュートリアル」
となっています。
対象者はプログラミングを始めたい人で、新しい技術を学びたい人
逆を言えば、このチュートリアルができない人で、プログラミングを学びたい人は
Elixir |> Collegeの対象者です。
また、このチュートリアルは完了して、日本語で学びたい人は TheWaggleのオンライン教材の対象者(2020年春頃ローンチに向けて作成中)です。
注意点
このチュートリアルは、最短で何を学ぶべきかと、流れを通してそれぞれの技術的な繋がりを把握してもらう為のものです。
独学ができる人に向けた最初の入り口です。
PHP? Python? Ruby? がやりたいだって?やりたい勉強すりゃいいよ。ただし一言だけ言っておく、Elixirは良いぞ(笑)
- HTML,CSS,JavaScript
- React
- GraphCMS
- Elixir
- Phoenix
- Ecto
- GraphQL(Queryのみ)
- Apollo
- Absinthe
- SQL
- mix
チュートリアルの流れ
- GraphCMSのアカウント登録
- GraphCMSでModelの作成
- Reactの環境構築(Yarnが使える人は飛ばす)
- サンプルプログラムのダウンロードと作成
- サンプルデータの作成
- GraphCMS Endpointの設定
- ElixirでGraphQL Server構築
1.GraphCMSのアカウント登録
下記のサイトへアクセスしてください。
https://graphcms.com/
- SignUpよりユーザー登録をします。
- その後、ログインして下さい。
- Login後、「Create new project」をクリックします。
- 「Form Scrach」を選択します。
5. 「Asia East」のリージョンを選びます。
6. Pearsonalプランを選択し、Continueを選びます。
7. モデルの作成から順に行って行きます。
2. GraphCMSでModelの作成
8. Schemaの設定
Schemaと書かれたタイトルの下にModelsと書かれていてサイドに[+]のボタンがあります。
9. Create Modelで「Display Name」の欄にAuthorと入力し、Create Modelを押します。
10. 右側にFIELDSと書かれたタブが表示されるので、クリックします。
11. 様々なFiledsのタイプがあります。今回は、Single Textをドラッグしてドロップします。
12. Display Nameに nameと入力します。
13. フィールドタイプが追加されるとこのような形になります。
同じ要領で、Authorのフィールドは以下のように設定します。
14. Authorを設定したら新しく、ModelをPostで作成します。フィールドは以下のようにします。
3.Reactの環境構築(Yarnが使える人は飛ばす)
NodeJSのインストール
LTS版と最新版があります。 LTS版をインストール
インストールの確認
コンソールを再起動します。
node --version
次のv12.13.1
ようにバージョン番号が表示されていたらインストール完了です。
npm --version
次のv6.12.1
ようにバージョン番号が表示されていたら成功です。
Yarn install
Windowsの場合は、yarn のインストーラーをダウンロードできるボタンが表示されるので
それをダウンロードしてインストールして下さい。
4. サンプルプログラムのダウンロードと作成
上記のサイトに下記コマンドを実行と記載があるので、下記のコマンドを実行します。
git clone https://github.com/GraphCMS/graphcms-examples.git && cd graphcms-examples/current/react-apollo-blog && yarn && yarn start
実行すると、ブラウザでlocalhost:3000で以下のサイトが見れたら成功です。
5. サンプルデータの作成
- 「content」ボタン(三本の横棒マーク)をクリックし、データを入力したい、「Model名」(画像の例は、Author)を選びます。
- 「Create New」をクリックすると、入力フィールドが表示されるので、適当な値を入れて「Published」を選んで「Save」します。
※Postにも忘れずに、同じ要領でサンプルデータを作成してください。
6. GraphCMS Endpointの設定
設定から、Endpointをコピーします。
Endpointをコピーしたら、設定より、PermissionsのScopeを「PROTECTED」から「QUERY」に変更します。
Endpointをプログラムに反映する
// Replace this with your project's endpoint
const GRAPHCMS_API = 'ここに先ほどコピーしたEndpointのURLを入れる'
ここまできたら yarn start
で無事に自分の入力したデータが表示される事を確認します。
ここからは、こちらのブログで書いた手順の5番目以降の説明と同じものになります。
https://qiita.com/Yoosuke/items/2346137ac39715b19cde
6. Absinthe を使用して GraphQL のアプリをセットアップします。
defp deps do
[
# existing dependencies
{:absinthe, "~> 1.4.16"},
{:absinthe_plug, "~> 1.4.0"},
{:absinthe_phoenix, "~> 1.4.0"}
]
end
mix deps.get
7.sampleBlog_web に schema フォルダを作成し、schema.ex ファイルを作成して、ファイルを作成します。
defmodule SampleBlogWeb.Schema.Schema do
use Absinthe.Schema
query do
@desc "Get a list of authors"
field :authors, list_of(:authors) do
resolve &SampleBlogWeb.Resolvers.Blog.authors/3
end
@desc "Get a author by its id"
field :author, :author do
arg :id, non_null(:id)
resolve &SampleBlogWeb.Resolvers.Blog.author/3
end
end
object :author do
field :id, non_null(:id)
field :name, non_null(:string)
field :bibliography, non_null(:string)
end
end
8.リゾルバモジュールファイルを作成します。 sampleBlog_web に resolvers フォルダを作成し、blog.exファイルを作成して、ファイルを作成します。
defmodule SampleBlog.Resolvers.Blog do
alias Getaways.Blog
def authors(_, _, _) do
{:ok, Blog.list_authors()}
end
def author(_, %{id: id}, _) do
{:ok, Blog.get_author!(id)}
end
end
9.スキーマとリゾルバの準備をしたら、ルーターを設定します。
defmodule SampleBlogWeb.Router do
defmodule SampleBlogWeb.Router do
use SampleBlogWeb, :router
pipeline :api do
plug :accepts, ["json"]
end
scope "/" do
pipe_through :api
forward "/api", Absinthe.Plug,
schema: SampleBlogWeb.Schema.Schema
forward "/graphiql", Absinthe.Plug.GraphiQL,
schema: SampleBlogWeb.Schema.Schema,
interface: :simple
end
end
最後にサーバーを起動してみます。
mix phx.server
これでlocalhost:4000/graphiql
にアクセスして以下の画面が出てきたら作成準備完了です。
GraphQLのクエリを書く
query {
authors{
id
name
bibliography
}
}
クエリを書いて、無事に成功していれば下記のようなデータが返ってきます。
React のreact-apollo-blog のAbout.jsに上記のクエリを上書きする
export const authors = gql`
query authors {
authors{
id
name
bibliography
}
}
`
エンドポイントを書き換える
const GRAPHCMS_API = http://localhost:4000/api/
これで、yarn start
してlocalhost:3000/about
ページにアクセスすると、、、見れません。
エラーを確認するとクロスサイトスクリプティングの問題でデータが取得できてないです。そこで、GraphQL server側に機能を追加します。
Cros_plugを追加する
defp deps do
[
# ~省略
{:absinthe, "~> 1.4.2"},
{:absinthe_plug, "~> 1.4.0"},
{:absinthe_phoenix, "~> 1.4.0"},
{:cors_plug, "~> 2.0"}, #<- 追加
]
end
機能を追加する。
$ mix deps.get
router.exのパイプラインにプラグを追加
pipeline :api do
plug CORSPlug, origin: "http://localhost:3000" #<-追加
plug :accepts, ["json"]
end
これで、 http://localhost:3000/about
にアクセスで以下のようにデータが取得できたら成功です。
最後に
いかがだったでしょうか、あまりにも長いのでもしかしたら、抜け漏れがあるかもしれません。
見つけたら遠慮なく、おしらせ下さい。喜んで修正したいと思います。
よければ、いいね。よろしくお願いします。励みになります。