Apollo Server: GraphQL 數據分頁概述

分頁概述

因爲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

關於 MySQL 的同步風格代碼

查詢方法定義

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 對象

參考資料

相關文章
相關標籤/搜索