「初めてのGraphQL」を読んだ。
グラフ理論の基本的な話や、スキーマの定義方法など勉強になったのだが、サンプルコード(主に5章)で躓くポイントが多かったので、その躓きポイントをメモ書き程度にまとめておく。
MongoDB や、Node.js のドライバーは最新のものを使っていた。
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 }
}
});
下記が参考になる。
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())
+
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()
は廃止されていそう