graphqlの練習がてらexpressでpixivのランキングを返すgraphql APIサーバを書いてみました。
ここで遊べます。
実装は、expressにexpress-graphqlミドルウェアを与えるだけです。
引数のオプションのgraphiql
というのはデモのアレですね。
すごく出来がいいです。
const graphqlHTTP = require('express-graphql')
app.use(
'/graphql',
graphqlHTTP({
schema,
rootValue: resolver,
graphiql: true,
})
)
あとは、引数にgraphqlのbuildSchemaで作成したスキーマを与えます。
const { buildSchema } = require('graphql')
const schema = buildSchema(`
type User {
id: Int
name: String
account: String
profileImageUrls: ProfileImageUrls
}
type ProfileImageUrls {
medium: String
}
type Tag {
name: String
}
type ImageUrls {
squareMedium: String
medium: String
large: String
}
enum Mode {
day
week
month
day_male
day_female
week_original
week_rookie
}
type MetaSinglePage {
originalImageUrl: String
}
type Illust {
id: Int
title: String
type: String
caption: String
tags: [Tag]!
imageUrls: ImageUrls
width: Int
height: Int
totalBookmarks: Int
user: User
tools: [String]
metaSinglePage: MetaSinglePage
}
type Query {
ranking(mode: Mode = "mode"): [Illust!]!
}
`)
module.exports = schema
非常に手軽ですね。
スキーマを除けば30行に満たないコードです。
書いた感じ、ルーティングを考えずに型だけを考えればいいので、気持ち実装のコストが低く、もしかすると普通にAPI書くより高速に作れるかもしれないという気持ちもしてきます。
気持ち
まだ良く見てないですが、flowとかtypescriptと型を共有したい場合どう書くのでしょうかね。
そのあたりの実装について知見がある人は、是非教えて下さい。
また、何か議論があれば、コメント欄またはtwitterまでお願いします。
Graphqlの練習にpixivのランキングのgraphql APIサーバ建てた。適当にポチれば遊べる https://t.co/q0oVjDFEkz
— 無職.js (@akameco) September 8, 2017
補完クソ便利 pic.twitter.com/hgoDIhCQgR
— 無職.js (@akameco) September 8, 2017
github
— 無職.js (@akameco) September 8, 2017
https://t.co/PFga0kQg5y
注意
pixivから返却されるjsonについては、まあ非公開なので、完全なスキーマを書いてません。
こういうラッパする場合は、リクエストからgraphqlの型を自動生成するのが王道っぽい感じがします。
このあたりも今後の課題といった感じですね。