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`);
          });
}