All Articles

「初めてのGraphQL」 のサンプルコードで動かない箇所について

「初めてのGraphQL」を読んだ。

グラフ理論の基本的な話や、スキーマの定義方法など勉強になったのだが、サンプルコード(主に5章)で躓くポイントが多かったので、その躓きポイントをメモ書き程度にまとめておく。

MongoDB や、Node.js のドライバーは最新のものを使っていた。

96ページの GraghQL Playground で totalPhotos のクエリ実行に失敗する

Unable to reach server というアラートが表示され、定義したスキーマが読み込めない。

plugins オプションに対して、 ApolloServerPluginLandingPageLocalDefault の設定が必要

const server = new ApolloServer({
  typeDefs,
  resolvers,
  // 下記の設定が必要
  plugins: [
    ApolloServerPluginLandingPageLocalDefault({ embed: true }),
  ],
  context: async ({ req }) => {
    const githubToken = req.headers.authorization
    const currentUser = await db.collection('users').findOne({ githubToken })
    return { db, currentUser }
  }
});

下記が参考になる。

131ページの GitHub API 認証に失敗する

https://developer.github.com/changes/2020-02-10-deprecating-auth-through-query-param/ の対応が必要。 API 認証の際にクエリパラメータが使えなくなっている。

diff --git a/chapter-05/photo-share-api/lib.js b/chapter-05/photo-share-api/lib.js
index ec52fc2..17f35af 100644
--- a/chapter-05/photo-share-api/lib.js
+++ b/chapter-05/photo-share-api/lib.js
@@ -22,9 +22,15 @@ const requestGithubToken = credentials =>
     ).then(res => res.json())
 
 const requestGithubUserAccount = token => 
-    fetch(`https://api.github.com/user?access_token=${token}`)
-        .then(res => res.json())
-        
+    fetch(
+      `https://api.github.com/user`,
+      {
+        headers: {
+          Authorization: `token ${token}`
+        }
+      }
+    ).then(res => res.json())
+            

130ページの replaceOne() による user の取得に失敗する

findOneAndReplace() を代わりに使うと動いた。

diff --git a/chapter-05/photo-share-api/resolvers/Mutation.js b/chapter-05/photo-share-api/resolvers/Mutation.js
index bdd12c7..8b42c54 100644
--- a/chapter-05/photo-share-api/resolvers/Mutation.js
+++ b/chapter-05/photo-share-api/resolvers/Mutation.js
@@ -58,9 +58,9 @@ module.exports = {
       avatar: avatar_url
     }
 
-    const { ops:[user] } = await db
+    const user = await db
       .collection('users')
-      .replaceOne({ githubLogin: login }, latestUserInfo, { upsert: true })
+      .findOneAndReplace({ githubLogin: login }, latestUserInfo, { upsert: true })
 
     return { user, token: access_token }

findOneAndReplace() の返り値やパラメータについては下記を参照。

https://mongodb.github.io/node-mongodb-native/6.5/classes/Collection.html#findOneAndReplace

insert() が実行できない

insertOne()insertMany() を使う

diff --git a/chapter-05/photo-share-api/resolvers/Mutation.js b/chapter-05/photo-share-api/resolvers/Mutation.js
index bdd12c7..a71666a 100644
--- a/chapter-05/photo-share-api/resolvers/Mutation.js
+++ b/chapter-05/photo-share-api/resolvers/Mutation.js
@@ -16,8 +16,8 @@ module.exports = {
       created: new Date()
     }
 
-    const { insertedIds } = await db.collection('photos').insert(newPhoto)
-    newPhoto.id = insertedIds[0]
+    const { insertedId } = await db.collection('photos').insertOne(newPhoto)
+    newPhoto.id = insertedId
 
     return newPhoto

insert() は廃止されていそう

https://github.com/mongodb/node-mongodb-native/blob/6d8ad3352c44de167f0ad6228ce5b8c9f93582de/src/collection.ts

Published Apr 28, 2024

しがないエンジニアがつぶやきを残します