はじめに
最短・最速で学ぶGraphQL実践入門 新たなAPI規格をマスターしよう! サーバーサイドCRUD編 (Node.js)
の受講メモです(無料でこれだけ勉強できるなんて、、、)
これだけじゃよくわからないので何かの間違いでこの記事に辿り着いた方は受講をお勧めします
セットアップ
- npm initでjsonファイル作成
- npm install expressでjsonに追加
- app.jsでexpress読み込み
appオブジェクトではwebアプリケーションに必要な変数・メソッド保持
- lisetenメソッド:サーバ起動
- nodemonで起動すれば変更保存時自動で再起動
- graphqlHTTPオブジェクト
- npm install nodemon json追加 nodmon appで起動
- npm install graphql express-graphql
- 一つのエンドポイントを実現するためにミドルウェアappオブジェクトよりappメソッド
スキーマ定義
graphqlの仕様を表現
データをどのように扱うか、リレーションの定義
- Movieタイプの生成
- ルートクエリの作成
mongoDBの設定
- クラスター作成
- ユーザ作成
- クラスター選択 -> コネクト -> DB接続url
- npm install mongoose
- appにmongooseオブジェクト作成→.connectで接続url設定
- データ作成
データベースモデルの作成
-
models -> movie.js
-
モデルをschema.jsで読み込み
-
そのままresolve関数の記述
-
module.exports = new GraphQLSchema→app.jsで読み込み
-
ミドルウェアに追加(一緒にgraphiQL設定)
ミューテーション(データ更新処理)
- クエリ同様schemaにミューテーションオブジェクト作成
☆typeとmodelの違いを調べる必要あり - exportsするGraphQLSchemaに追加
- graphiQLからmutation実行
DirectorTypeの追加
流れ予想
- スキーマでDirectorType作成→◯
- RootQueryのfieldsにdirector追加→×追加には不要、その後実装だった
- MutationのfieldsにaddDirector追加→◯
- models -> director.js作成→◯
- スキーマでdirectorモデル読み込み→×と思いきや◯
addメソッドのnewではなぜかDirector(モデル)ではなくDirectorTypeで作成
←講師の勘違い、あってた
再度GraphiQL実行、→mutation失敗←resolve関数のsaveメソッド忘れ、解決
collectionに追加確認、_v属性って何だろう。。。0が入ってたけど→データの更新回数カウント
Type間にリレーション追加
- MovieモデルのSchemaにDirectorID追加
- schema.jsのMovieモデルfieldsにdirector(IDじゃないよ、ID以外の情報も欲しいでしょうが)追加(ここのtypeはDirectorType)、Director情報取得用のresolve追加
- ってことはmodelファイルの方には単純に保持しているデータ、schemaの方にはそのデータから表示したい情報まで記述か!
- resolve関数のparentってTypeの元になってるモデルファイルで定義したパラメータが入ってる、Typeの親がModelってことなのね
- schmea.jsのDirectorモデルfieldsにmovies追加、typeは
new GraphQLList(MovieType)
←ただのGraphQLListじゃない
resolve関数のreturnはfindByIDではなく(そりゃそう、DirectorIDに一致してるMovieIDの映画なんてあるかい)、DirectorIDがparent.idに一致している映画全部を検索する - mutationの変更、addMovieにDirectorID追加
一覧取得
RootQueryに追加、特に不明点なし
mutationに更新処理追加
- updateDirector追加
※javascriptの&&は左がfalseなら左を返し、左がtrueなら右の値を返す
戻り値はfindByIdAndUpdate
メソッドでargs.idと一致したdirectorをupdateし、第3引数の{new: true}で変更後の値を取得 - 同様にupdateMovie追加
mutationにデリート処理追加
- deleteMovie追加
※findByIdなどはmongooseのメソッド
findByAndRemoveで削除 - deleteDirector追加