Axios 在 Gatsby onPostBuild 中不调用 运行
Axios call not running in Gatsby onPostBuild
我正在尝试使用我在构建过程中早期构建的帖子列表从 FB 获取一些数据。当我在 gatsby-node.js
:
中有此代码时
exports.onPostBuild = () => {
console.info(`console.log => 1`);
const postSlugs = require('./content/post-slugs.json');
const siteConfig = require('./gatsby-config');
const siteUrl = siteConfig.siteMetadata.siteUrl.replace(/\/$/, '');
console.info(`console.log => 2`);
axios.get(`https://graph.facebook.com/v11.0/?id=${siteUrl}${postSlugs[0]}&access_token=xxxxxx&fields=engagement`)
.then(res => {
console.info(`console.log => 3`);
console.log(JSON.stringify(res));
})
.catch(err => {
console.info(`console.log => 4`);
console.log(JSON.stringify(err));
})
.then(() => {
console.info(`console.log => 5`);
});
console.info(`console.log => 6`);
};
我得到的输出是:
success Building production JavaScript and CSS bundles - 5.746s
success Building HTML renderer - 1.073s
success Building static HTML for pages - 0.532s - 79/79 148.37/s
info console.log => 1
info console.log => 2
info console.log => 6
success onPostBuild - 0.045s
为什么 none 的承诺回调被调用?
我为此尝试了原始节点 api 以及 axios。
您需要等待函数完成,使用 async
/await
应该可以。类似于:
exports.onPostBuild = async () => {
console.info(`console.log => 1`);
const postSlugs = require('./content/post-slugs.json');
const siteConfig = require('./gatsby-config');
const siteUrl = siteConfig.siteMetadata.siteUrl.replace(/\/$/, '');
console.info(`console.log => 2`);
await axios.get(`https://graph.facebook.com/v11.0/?id=${siteUrl}${postSlugs[0]}&access_token=xxxxxx&fields=engagement`)
.then(res => {
console.info(`console.log => 3`);
console.log(JSON.stringify(res));
})
.catch(err => {
console.info(`console.log => 4`);
console.log(JSON.stringify(err));
})
.then(() => {
console.info(`console.log => 5`);
});
console.info(`console.log => 6`);
};
现在,您甚至可以隔离逻辑:
exports.onPostBuild = async () => {
console.info(`console.log => 1`);
const postSlugs = require('./content/post-slugs.json');
const siteConfig = require('./gatsby-config');
const siteUrl = siteConfig.siteMetadata.siteUrl.replace(/\/$/, '');
console.info(`console.log => 2`);
let data= await fetchData();
console.info(`console.log => 6`);
};
async function fetchData(){
await await axios.get(`https://graph.facebook.com/v11.0/?id=${siteUrl}${postSlugs[0]}&access_token=xxxxxx&fields=engagement`)
.then(res => {
console.info(`console.log => 3`);
console.log(JSON.stringify(res));
})
.catch(err => {
console.info(`console.log => 4`);
console.log(JSON.stringify(err));
})
.then(() => {
console.info(`console.log => 5`);
});
}
我正在尝试使用我在构建过程中早期构建的帖子列表从 FB 获取一些数据。当我在 gatsby-node.js
:
exports.onPostBuild = () => {
console.info(`console.log => 1`);
const postSlugs = require('./content/post-slugs.json');
const siteConfig = require('./gatsby-config');
const siteUrl = siteConfig.siteMetadata.siteUrl.replace(/\/$/, '');
console.info(`console.log => 2`);
axios.get(`https://graph.facebook.com/v11.0/?id=${siteUrl}${postSlugs[0]}&access_token=xxxxxx&fields=engagement`)
.then(res => {
console.info(`console.log => 3`);
console.log(JSON.stringify(res));
})
.catch(err => {
console.info(`console.log => 4`);
console.log(JSON.stringify(err));
})
.then(() => {
console.info(`console.log => 5`);
});
console.info(`console.log => 6`);
};
我得到的输出是:
success Building production JavaScript and CSS bundles - 5.746s
success Building HTML renderer - 1.073s
success Building static HTML for pages - 0.532s - 79/79 148.37/s
info console.log => 1
info console.log => 2
info console.log => 6
success onPostBuild - 0.045s
为什么 none 的承诺回调被调用?
我为此尝试了原始节点 api 以及 axios。
您需要等待函数完成,使用 async
/await
应该可以。类似于:
exports.onPostBuild = async () => {
console.info(`console.log => 1`);
const postSlugs = require('./content/post-slugs.json');
const siteConfig = require('./gatsby-config');
const siteUrl = siteConfig.siteMetadata.siteUrl.replace(/\/$/, '');
console.info(`console.log => 2`);
await axios.get(`https://graph.facebook.com/v11.0/?id=${siteUrl}${postSlugs[0]}&access_token=xxxxxx&fields=engagement`)
.then(res => {
console.info(`console.log => 3`);
console.log(JSON.stringify(res));
})
.catch(err => {
console.info(`console.log => 4`);
console.log(JSON.stringify(err));
})
.then(() => {
console.info(`console.log => 5`);
});
console.info(`console.log => 6`);
};
现在,您甚至可以隔离逻辑:
exports.onPostBuild = async () => {
console.info(`console.log => 1`);
const postSlugs = require('./content/post-slugs.json');
const siteConfig = require('./gatsby-config');
const siteUrl = siteConfig.siteMetadata.siteUrl.replace(/\/$/, '');
console.info(`console.log => 2`);
let data= await fetchData();
console.info(`console.log => 6`);
};
async function fetchData(){
await await axios.get(`https://graph.facebook.com/v11.0/?id=${siteUrl}${postSlugs[0]}&access_token=xxxxxx&fields=engagement`)
.then(res => {
console.info(`console.log => 3`);
console.log(JSON.stringify(res));
})
.catch(err => {
console.info(`console.log => 4`);
console.log(JSON.stringify(err));
})
.then(() => {
console.info(`console.log => 5`);
});
}