因爲Relay中的分頁比較複雜, 本文不使用Relay的方式進行分頁, 使用自定義GraphQL分頁類型的方式進行分頁.html
REST的分頁方式:node
https://meta.discourse.org/articles?p=1
GraphQL查詢分頁mysql
{ articles { total_items # 總數 page_no # 當前頁號 page_items # 每頁結果數 pages # 總頁數 rows: { # 分頁結果 title, author, published_at } } }
首先咱們須要定義一個GraphQL的分頁類型, 對於上述文章例子, 咱們定義一個ArticlePagination
類型以下:git
# 文章分頁對象 type ArticlePagination { # 總共有多少條數據 total_items: Int! # 總共有多少頁 pages: Int! # 當前頁號 page_no: Int! # 每頁顯示多少條數據 page_items: Int! # 分頁列表 rows: [Article] }
而後在咱們的查詢字段中返回這個分頁對象github
type Query { ... articles(page_no: Int!, page_items: Int!): ArticlePagination ... }
定義解析函數sql
async feedbacks(_, { page_no, page_items }) { return db.paginateArticles(page_no, page_items) }
上述說明都是我本身參考這個項目的學習成功, 因爲目前開發的項目不是開源項目, 因此就沒有完整的演示代碼了.數據庫
使用了 ES7 的 async/await
功能, 讓MySQL支持同步風格代碼(對於這裏是必須的, 不然解析函數會有問題)babel
使用了 babel-node
直接運行ES6代碼, 須要按照 babel-cli
工具koa
使用 nodemon
來監視文件的變化, 實現熱加載async
查詢方法定義
function query_sync(sql, params) { return new Promise((resolve, reject) => { pool.getConnection(function (err, connection) { if (err) { reject(err) } else { connection.query(sql, params, (err, rows) => { if (err) { reject(err) } else { resolve(rows) } connection.release() }) } }) }) }
對於 async/await 的數據庫卡查詢, await 後的函數老是返回一個Promise對象, 下面是調用方式
exports.paginateArticles = async function(){ let limit = 10 let offset = 0 let stmt = 'SELECT * FROM articles LIMIT ? OFFSET ?' let result = await query_sync(stmt, [limit, offset]) return result }
await
只能用在 async
函數中
await
函數必須返回一個 Promise
對象