图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);
我正在使用这个脚本来获取聊天记录。我最多需要 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 在它的响应中返回一个 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);