【问题标题】:Gatsby API Request on Build TimeGatsby API 对构建时间的请求
【发布时间】:2021-07-30 03:29:08
【问题描述】:

我有一个 gatsby 项目,我需要在其中发出 API 请求以获取汽车列表,我将使用该列表为每辆汽车动态创建页面。 API 响应数据如下:

{
  "Fleet_Data": [
      {
          "Make": "Honda",
          "Model": "Pilot"
      },
      {
          "Make": "Honda",
          "Model": "CRV"
      },
      {
          "Make": "Honda",
          "Model": "Accord"
      }
  ]
}

我正在使用gatsby-source-custom-api 插件。这是我的gatsby-config.js 文件:

{
  resolve: "gatsby-source-custom-api",
  options: {
    url: "https://api.fleetdata.com/",
    headers: {
      Authorization: 'Basic API_KEY'
    },
    rootKey: "Fleet_Data",
    schemas: {
      Fleet_Data: `
                    Make: String
                    Model: String
                `
    }
  }
}

我的节点文件中除了调试之外没有任何内容,但这是我的gatsby-node.js

const path = require("path");

exports.createPages = async ({ graphql }) => {
  console.log("IT WORKED")
};

但是当我运行 gatsby build 时,我在控制台中收到以下错误:

"gatsby-source-custom-api" threw an error while running the sourceNodes lifecycle:

invalid json response body at https://api.fleetdata.com/ reason: Unexpected token : in JSON at position 4

  23 |
  24 |   const URL = getUrl(process.env.NODE_ENV, url)
> 25 |   const data = await fetch(URL).then(res => res.json())
     |                ^
  26 |
  27 |   const typeDefs = getTypeDefs(schemas, imageKeys)
  28 |   createTypes(typeDefs)

File: node_modules/gatsby-source-custom-api/gatsby-node.js:25:16



  FetchError: invalid json response body at https://api.fleetdata.com/ reason: Unexpected token : in JSON at position 4
  
  - index.js:272 
    [ProjectCars]/[node-fetch]/lib/index.js:272:32
  
  - task_queues.js:95 processTicksAndRejections
    internal/process/task_queues.js:95:5
  
  - gatsby-node.js:25 Object.exports.sourceNodes
    [ProjectCars]/[gatsby-source-custom-api]/gatsby-node.js:25:16
  
  - api-runner-node.js:429 runAPI
    [ProjectCars]/[gatsby]/src/utils/api-runner-node.js:429:16
  

not finished source and transform nodes - 3.913s

我在这里做错了什么?

【问题讨论】:

    标签: javascript node.js reactjs gatsby gatsby-plugin


    【解决方案1】:

    这是通过在gatsby-node.js 文件中调用简单的 fetch api 来解决的,而不是使用插件。 gatsby-source-custom-api 插件似乎并不打算用于这种特殊情况,尽管它的名称和文档..

    【讨论】:

      【解决方案2】:

      通常此问题是由undefined API 响应引起的,通常是由服务器停机、错误配置等引起的。

      在您的情况下,我已经使用 Postman 对其进行了测试,但它会引发错误:https://api.fleetdata.com/ 没有响应,因此因为您没有将其包装在 try/catch 中或捕获异常,它会失败,因为插件可以' t 获取数据。

      或者,由于您将实现委托给第三方插件,我认为没有办法在不进行 PR 或调整/自定义插件的情况下解决此问题。您的实现非常“基本”或标准,因此要修复它,您可能需要打开作者存储库的线程。

      您始终可以向您的 API 添加fetch 请求并相应地自定义给定节点。

      【讨论】:

      • 但是我应该在哪里包装 try catch?这是使用 gatsby 的插件,根据 github 文档,没有地方可以将 try catch 放在插件配置中
      • 好吧,不是你,插件。事实是该请求抛出了FetchError,因为它无法从 API 获取数据。我无法使用您的参数向该 API 发出 GET 请求(甚至直接访问 api.fleetdata.com。API 似乎已关闭。您的配置看起来不错,但 API 没有响应
      • 出于安全考虑,我没有发布完整的网址。它只是代表 API 端点的占位符。我可以使用邮递员 ping 和检索 json 数据
      • 哦,我明白了。尝试自定义标头以仅接受 JSON 响应
      • 我在标题中添加了'Content-Type': 'application/json',但仍然没有运气,同样的错误
      猜你喜欢
      • 2020-12-23
      • 2019-04-17
      • 2018-07-06
      • 2021-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      相关资源
      最近更新 更多