gpt4 book ai didi

node.js - 查询 WordPress WP-API 中的大量帖子(使用 Promise!)

转载 作者:太空宇宙 更新时间:2023-11-04 02:02:16 26 4
gpt4 key购买 nike

我正在开发一个 Node.js 应用程序,该应用程序使用 WordPress JSON API 作为一种 headless CMS。当应用程序启动时,我们查询 WP 数据库并提取我们需要的信息(使用 Axios),对其进行操作并临时存储。

足够简单 - 但我们在 CMS 中的帖子类别之一有相当多的条目。出于某种不可预见的原因,WordPress 将 API 请求限制为一次最多 99 个帖子,并要求我们编写一个可以发送并发 API 请求的循环,直到提取所有数据。

例如,如果我们有 250 个特定类型的帖子,我需要分别访问该路线三次,并每次指定我想要的特定数据“页面”。

根据文档,https://developer.wordpress.org/rest-api/using-the-rest-api/pagination/ ,我可以访问 ?page= 查询字符串,我可以使用它来同时发送这些请求。 (即...&page=2)

我还可以访问 headers 对象中的 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);
});
}

我很确定有更好的解决方法来实现这一目标。

关于node.js - 查询 WordPress WP-API 中的大量帖子(使用 Promise!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45577541/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com