Проблема с созданием плагина gatsby source plugin

#gatsby

#gatsby

Вопрос:

Я впервые создаю плагин Gatsby source и сталкиваюсь с проблемами при извлечении данных.

Я следовал этому руководству, но хотел попробовать использовать другой API.

Я хочу использовать свой ключ API виджетов локатора магазина. https://www.storelocatorwidgets.com/admin/api/v1/locations?api_key=API_KEY_GOES_HERE

Я выполнил те же действия и изменил URL api, но получил это сообщение об ошибке в терминале:

 TypeError: data.locations.forEach is not a function
  

Вот мой gatsby-node.js файл:

 const fetch = require("node-fetch")
const queryString = require("query-string")

exports.sourceNodes = (
  { actions, createNodeId, createContentDigest },
  configOptions
) => {
  const { createNode } = actions

  // Gatsby adds a configOption that's not needed for this plugin, delete it
  delete configOptions.plugins
  // Convert the options object into a query string
  const apiOptions = queryString.stringify(configOptions)
  // Join apiOptions with the Pixabay API URL
  const apiUrl = `https://www.storelocatorwidgets.com/admin/api/v1/locations?${apiOptions}`
  // Gatsby expects sourceNodes to return a promise
  return (
    // Fetch a response from the apiUrl
    fetch(apiUrl)
      // Parse the response as JSON
      .then(response => response.json())
      // Process the JSON data into a node
      .then(data => {
        // For each query result (or 'hit')
        data.locations.forEach(address => {
          console.log("address data is:", address)
        })
      })
  )
}
  

И вот мой gatsby-config.js файл:

 module.exports = {
  siteMetadata: {
    title: `Gatsby Default Starter`,
    description: `Kick off your next, great Gatsby project with this default starter. This barebones starter ships with the main Gatsby configuration files you might need.`,
    author: `@gatsbyjs`,
  },
  plugins: [
    `gatsby-plugin-react-helmet`,
    {
      resolve: `gatsby-source-filesystem`,
      options: {
        name: `images`,
        path: `${__dirname}/src/images`,
      },
    },

    {
      resolve: "gatsby-source-pixabay",
      options: {
        api_key: "f360e50a2c34ffb4a149d10372fe700e",
      },
    },

    `gatsby-transformer-sharp`,
    `gatsby-plugin-sharp`,
    {
      resolve: `gatsby-plugin-manifest`,
      options: {
        name: `gatsby-starter-default`,
        short_name: `starter`,
        start_url: `/`,
        background_color: `#663399`,
        theme_color: `#663399`,
        display: `minimal-ui`,
        icon: `src/images/gatsby-icon.png`, // This path is relative to the root of the site.
      },
    },
    // this (optional) plugin enables Progressive Web App   Offline functionality
    // To learn more, visit: https://gatsby.dev/offline
    // 'gatsby-plugin-offline',
  ],
}
  

И вот объект JSON, который должен быть извлечен, но не является:

 {
  "status": "OK",
  "locations": {
    "13466445": {
      "name": "Village Green Society",
      "display_order": "999999",
      "filters": null,
      "createstamp": "1536191260",
      "editstamp": "1546982631",
      "geocodestatus": "Manual",
      "geocodetimestamp": "0",
      "google_placeid": "",
      "locationid": "13466445",
      "description": "",
      "address": "2043 16th St, Boulder, CO, 80302, US",
      "image": "",
      "website": "https://villagegreenboulder.com/",
      "website_text": "",
      "facebook": "",
      "instagram": "https://www.instagram.com/villagegreenboulder/",
      "twitter": "",
      "phone": "(720) 389-5726",
      "phone2": "",
      "fax": "",
      "email": "",
      "hours_Monday": "",
      "hours_Tuesday": "",
      "hours_Wednesday": "",
      "hours_Thursday": "",
      "hours_Friday": "",
      "hours_Saturday": "",
      "hours_Sunday": "",
      "store_list_footer": "",
      "print_directions_button": null,
      "map_lat": "40.019788",
      "map_lng": "-105.275335",
      "priority_type": "",
      "priority_setting": "Random",
      "z_index": "",
      "visibility": "",
      "markerid": "default"
    },
  },
}
  

Я пропустил какой-то шаг? Кажется, что это должно сработать, но это моя первая попытка создания плагина с исходным кодом, поэтому я не так хорошо знаком с процессом. Буду признателен за любую помощь.

Ответ №1:

Ошибка типа: данные.местоположения.forEach — это не функция

forEach(...) это метод array, и похоже, что ваша конечная точка возвращает местоположения не в виде массива, а объекта с идентификатором каждого местоположения в качестве ключа. Попробуйте превратить data.locations в массив:

 Object.keys(data.locations).forEach(address => {
  console.log("address data is:", address)
})
  

Комментарии:

1. Спасибо, это позволило собрать все данные @dereknguyen