[英]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.