我正在开发一个Node.js应用程序,它使用WordPress JSON API作为一种无头CMS。当应用程序旋转时,我们向WP数据库查询并提取我们需要的信息(使用Axios),操纵它并临时存储它。
很简单 - 但CMS中的一个帖子类别有相当多的条目。出于一些令人遗憾的原因,WordPress一次将API请求限制限制为最多99个帖子,并要求我们编写一个可以发送并发API请求的循环,直到所有数据都被提取为止。
例如,如果我们有250个某些给定类型的帖子,我需要分三次点击该路由,指定每次我想要的特定数据“页面”。
根据文档,https://developer.wordpress.org/rest-api/using-the-rest-api/pagination/,我可以访问?page=
查询字符串,我可以使用它来同时发送这些请求。 (即...&page=2
)
我还可以访问header对象中的X-WP-Total
,它给出了给定类别中的帖子总数。
但是,这些API调用是嵌套的promise链的一部分,整个过程需要返回一个我可以继续链接的promise。
我们的想法是让它变得动态,因此它总是会提取所有数据,并将其作为一个巨大的帖子返回。这就是我的功能:
const request = require('axios');
module.exports = (request_url) => new Promise((resolve, reject) => {
// START WITH SMALL ARBITRARY REQUEST TO GET TOTAL NUMBER OF POSTS FAST
request.get(request_url + '&per_page=1').then(
(apiData) => {
// SETUP FOR PROMISE.ALL()
let promiseArray = [];
// COMPUTE HOW MANY REQUESTS WE NEED
// ALWAYS ROUND TOTAL NUMBER OF PAGES UP TO GET ALL THE DATA
const totalPages = Math.ceil(apiData.headers['x-wp-total']/99);
for (let i = 1; i <= totalPages; i++) {
promiseArray.push( request.get(`${request_url}&per_page=99&page=${i}`) )
};
resolve(
Promise.all(promiseArray)
.then((resolvedArray) => {
// PUSH IT ALL INTO A SINGLE ARRAY
let compiledPosts = [];
resolvedArray.forEach((axios_response) => {
// AXIOS MAKES US ACCESS W/RES.DATA
axios_response.data.forEach((post) => {
compiledPosts.push(post);
})
});
// RETURN AN ARRAY OF ALL POSTS REGARDLESS OF LENGTH
return compiledPosts;
}).catch((e) => { console.log('ERROR'); reject(e);})
)
}
).catch((e) => { console.log('ERROR'); reject(e);})
})
任何创造性的想法,以使这种模式更好?
我有完全相同的问题。在我的情况下,我使用Vue资源:
this.$resource('wp/v2/media').query().then((response) => {
let pagesNumber = Math.ceil(response.headers.get('X-WP-TotalPages'));
for(let i=1; i <= pagesNumber; i++) {
this.$resource('wp/v2/media?page='+ i).query().then((response) => {
this.medias.push(response.data);
this.medias = _.flatten(this.medias);
console.log(this.medias);
});
}
我很确定有更好的解决方法来实现这一目标。