[英]Cursor based pagination graphql
我正在通過 koa 服務器從 graphql 檢索數據。 為此,我寫了一個 function requestData(token, queryName, cursor)
來調用 graphql。
我想重復請求,直到 cursor 為 null 或未定義。
我總是需要使用最后一個 cursor:
lastCursor = edges[edges.length - 1].cursor;
在終端中,我得到以下輸出:
null
eyJsYXN0X2lkIjo2MTQzNTk3ODcxMjc0LCJsYXN0X3ZhbHVlIjoiNjE0MzU5Nzg3MTI3NCJ9
即使我有更多數據,我也得到了這個 output。 有人可以幫我弄清楚我的代碼有什么問題嗎?
server.js 部分
router.post('/getAllProducts', bodyParser(), async (ctx, next) => {
let data;
let edges;
let lastCursor = null;
const { accessToken } = ctx.session;
ctx.response.status = 200;
requestData(accessToken, GET_ALL_PRODUCTS, lastCursor).then((res) => {
data = res.data.data;
edges = data.products.edges;
lastCursor = edges[edges.length - 1].cursor;
setTimeout(() => {
requestData(accessToken, GET_ALL_PRODUCTS, lastCursor);
}, 1000);
});
});
function requestData(token, queryName, cursor) {
const variables = { after: cursor };
console.log(cursor);
const res = axios({
headers: {
'X-Shopify-Access-Token': token,
},
method: 'post',
data: {
query: queryName,
variables: variables,
},
url: url,
});
return res;
}
似乎您需要對代碼實現一些遞歸 - 如下所示:
router.post('/getAllProducts', bodyParser(), async (ctx, next) => {
let allProducts;
const { accessToken } = ctx.session;
ctx.response.status = 200;
function loadData(cursor) {
requestData(accessToken, GET_ALL_PRODUCTS, cursor).then((res) => {
const data = res.data.data;
// process data here, eg: allProducts = [...allProducts, ...data];
const edges = data.products.edges;
const nextCursor = edges.length ? edges[edges.length - 1].cursor : null;
if (nextCursor) {
setTimeout(() => {
loadData(nextCursor);
}, 1000);
} else {
// now we have all data
sendToClient(allProducts);
}
});
}
loadData(null);
});
function requestData(token, queryName, cursor) {
const variables = { after: cursor };
console.log(cursor);
const res = axios({
headers: {
'X-Shopify-Access-Token': token,
},
method: 'post',
data: {
query: queryName,
variables: variables,
},
url: url,
});
return res;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.