Skip to content

API: Пагинация

Документация класса PaginatedResult для работы с постраничной навигацией.

Получение PaginatedResult

typescript
const result = await Model.findManyPaginated(options, page, perPage)

Свойства

data

Тип: T[]

Массив документов текущей страницы.

typescript
const result = await User.findManyPaginated({}, 1, 10)
console.log(result.data) // Array<User>

state

Тип: PaginationState

Объект с информацией о состоянии пагинации.

typescript
interface PaginationState {
  skip: number       // количество пропущенных документов
  limit: number      // документов на страницу
  page: number       // текущая страница
  total: number      // всего документов
  totalPages: number // всего страниц
  left: number       // осталось документов
}

Пример

typescript
const result = await User.findManyPaginated({}, 2, 10)

console.log(result.state.page)       // 2
console.log(result.state.total)      // 95
console.log(result.state.totalPages) // 10
console.log(result.state.limit)      // 10
console.log(result.state.skip)       // 10
console.log(result.state.left)       // 75

options

Тип: FindManyOptions | {}

Опции, переданные при запросе.

Методы

next()

Переходит к следующей странице.

typescript
next(): Promise<PaginatedResult<T>>

Возвращает: this (текущий экземпляр с обновлёнными данными).

typescript
const result = await User.findManyPaginated({}, 1, 10)
console.log(result.state.page) // 1

await result.next()
console.log(result.state.page) // 2
console.log(result.data)       // данные страницы 2

previous()

Переходит к предыдущей странице.

typescript
previous(): Promise<PaginatedResult<T>>

Возвращает: this (текущий экземпляр с обновлёнными данными).

Ошибка на первой странице

Вызов previous() на первой странице выбросит ошибку.

typescript
const result = await User.findManyPaginated({}, 3, 10)

await result.previous()
console.log(result.state.page) // 2

await result.previous()
console.log(result.state.page) // 1

// Ошибка!
await result.previous() // Error: Page cannot be lower than 1

TypeScript типы

PaginatedResult<T>

typescript
class PaginatedResult<T = {}> {
  state: PaginationState
  data: Array<T>
  options: FindManyOptions | {}
  
  next(): Promise<PaginatedResult<T>>
  previous(): Promise<PaginatedResult<T>>
}

PaginationState

typescript
interface PaginationState {
  skip: number
  limit: number
  page: number
  total: number
  totalPages: number
  left: number
}

FindManyOptions

typescript
interface FindManyOptions {
  page: number
  perPage: number
  search?: string
  sort?: string
  fields?: string[]
}

Примеры использования

Проверка наличия страниц

typescript
const result = await User.findManyPaginated({}, 1, 10)

const hasNextPage = result.state.page < result.state.totalPages
const hasPrevPage = result.state.page > 1

console.log('Есть следующая:', hasNextPage)
console.log('Есть предыдущая:', hasPrevPage)

Отображение информации о пагинации

typescript
const result = await User.findManyPaginated({}, 2, 10)

const { page, totalPages, total, limit } = result.state
const from = (page - 1) * limit + 1
const to = Math.min(page * limit, total)

console.log(`Показаны записи ${from}-${to} из ${total}`)
// "Показаны записи 11-20 из 95"

Навигация по всем страницам

typescript
async function getAllPages<T>(model: any, options = {}, perPage = 100) {
  const allItems: T[] = []
  let result = await model.findManyPaginated(options, 1, perPage)
  
  allItems.push(...result.data)
  
  while (result.state.page < result.state.totalPages) {
    await result.next()
    allItems.push(...result.data)
  }
  
  return allItems
}

// Использование
const allUsers = await getAllPages(User, { sort: 'name' }, 100)

Генератор страниц

typescript
async function* pageGenerator<T>(model: any, options = {}, perPage = 25) {
  let page = 1
  let hasMore = true
  
  while (hasMore) {
    const result = await model.findManyPaginated(options, page, perPage)
    yield result.data
    
    hasMore = result.state.page < result.state.totalPages
    page++
  }
}

// Использование
for await (const pageData of pageGenerator(User)) {
  console.log(`Загружена страница с ${pageData.length} пользователями`)
  // Обработка данных...
}

Опубликовано под лицензией ISC.