图API:中断Pagination的正确方法是什么

Graph API: What is the correct way to interrupt Pagination

我正在使用这个脚本来获取聊天记录。我最多需要 100 次聊天,但可能一次聊天没有 100 条消息。我怎样才能在这个脚本中处理这种情况?

我正在使用 Node 包 Microsoft Graph 客户端。

    const { Client, PageIterator } = require('@microsoft/microsoft-graph-client');
    async getChatList(GroupChatId) {
        let messages = [];

        let count = 0;
        let pauseAfter = 100; // 100 messages limit

        let response = await this.graphClient
            .api(`/chats/${GroupChatId}/messages`)
            .version('beta')
            .get();


        let callback = (data) => {
            messages.push(data);
            count++;
            return count < pauseAfter;
        }

        let pageIterator = new PageIterator(this.graphClient, response, callback);
        await pageIterator.iterate();

        return messages;

    }

您需要使用条件语句检查消息是否有价值。

伪代码如下:

let callback = (data) => {

    if(data != "" || data != null)
    {
       messages.push(data);
       count++;
       return count < pauseAfter;
    }
   else{
      return;
   }

}

正如我在 GitHub issue you opened 上回答的那样,如果迭代器在达到“最大值”之前用完了要迭代的项目,它应该自行停止。但是,我认为您在使用 /chats/id/messages.

的特定 API 中遇到了错误

问题是这个 API 在它的响应中返回一个 nextLink 值,即使没有下一页。它不应该,我正在向 Teams 人员报告。这导致 pageIterator 尝试获取下一组结果,其中 returns 0 个项目和一个 nextLink。您陷入了无限循环。

因此,使用 pageIterator 对这个 API 不起作用。您需要自己进行迭代。下面是一些 TypeScript 代码来展示它:

let keepGoing: Boolean = true;
do
{
  // If there are no items in the page, then stop
  // iterating.
  keepGoing = currentPage.value.length > 0;

  // Loop through the current page
  currentPage.value.forEach((message) => {
    console.log(JSON.stringify(message.id));
  });

  // If there's a next link follow it
  if (keepGoing && !isNullOrUndefined(currentPage["@odata.nextLink"]))
  {
    currentPage = await client
      .api(currentPage["@odata.nextLink"])
      .get();
  }
} while (keepGoing);