如何使用GraphQL DataLoader实现分页?

时间:2019-09-25 01:04:15

标签: javascript sql graphql

我有以下GraphQL查询:

{
  events {
    name
    images {
      uri
    }
  }
}

当前,我无法(不知道如何)在该images字段中处理分页,因为它是使用DataLoader提取的。

eventImagesLoader(DataLoader)实现如下:

import DataLoader from 'dataloader';
import { getRepository } from 'typeorm';
import { EventImage } from '../entities/event-image';

export const eventImagesLoader = () =>
  new DataLoader<string, EventImage[]>(async (eventIds) => {
    const images = await getRepository(EventImage)
      .createQueryBuilder('image')
      .where('image.eventId IN (:...ids)', { ids: eventIds })
      .getMany();

    const imagesMap = new Map<string, EventImage[]>();

    images.forEach((image) =>
      imagesMap.has(image.eventId)
        ? imagesMap.get(image.eventId)!.push(image)
        : imagesMap.set(image.eventId, [image])
    );

    return eventIds.map((eventId) => imagesMap.get(eventId) || []);
  });

我面临的问题是在这种情况下处理分页,因为如果您在上面的代码摘录中看到,我将以这种方式查询数据库:

const images = await getRepository(EventImage)
  .createQueryBuilder('image')
  .where('image.eventId IN (:...ids)', { ids: eventIds })
  .getMany();

翻译成这样的SQL:

SELECT * FROM  `event_image` AS image WHERE image.id IN ("id:1", "id:2", "id:n");

在这种情况下,我使用DataLoader将所有数据库查询批处理为一个(上面的一个)。


因此,我如何处理分页?

我想做这样的事情:

{
  events {
    name
    images(page: Int) {
      uri
    }
  }
}

0 个答案:

没有答案