Если вы хотите использовать GraphQL для получения данных, вам нужно создать sourceNode
. Документ о создании исходного плагина может помочь ты.
Выполните следующие действия, чтобы иметь возможность запрашивать randomuser
данные с помощью GraphQL в вашем проекте Gatsby.
1) Создайте узлы в gatsby-node.js
В корневой папке проекта добавьте этот код в gatsby-node.js
:
const axios = require('axios');
const crypto = require('crypto');
exports.sourceNodes = async ({ actions }) => {
const { createNode } = actions;
// fetch raw data from the randomuser api
const fetchRandomUser = () => axios.get(`https://randomuser.me/api/?results=500`);
// await for results
const res = await fetchRandomUser();
// map into these results and create nodes
res.data.results.map((user, i) => {
// Create your node object
const userNode = {
// Required fields
id: `${i}`,
parent: `__SOURCE__`,
internal: {
type: `RandomUser`, // name of the graphQL query --> allRandomUser {}
// contentDigest will be added just after
// but it is required
},
children: [],
// Other fields that you want to query with graphQl
gender: user.gender,
name: {
title: user.name.title,
first: user.name.first,
last: user.name.last,
},
picture: {
large: user.picture.large,
medium: user.picture.medium,
thumbnail: user.picture.thumbnail,
}
// etc...
}
// Get content digest of node. (Required field)
const contentDigest = crypto
.createHash(`md5`)
.update(JSON.stringify(userNode))
.digest(`hex`);
// add it to userNode
userNode.internal.contentDigest = contentDigest;
// Create node with the gatsby createNode() API
createNode(userNode);
});
return;
}
Я использовал axios
для получения данных, поэтому вам нужно будет установить его: npm install --save axios
Объяснение:
Цель состоит в том, чтобы создать каждый узел для каждого фрагмента данных, который вы хотите использовать. Согласно документации createNode, вы должны предоставить объекту несколько обязательных полей (идентификатор, родительский, внутренний, дочерний).
Как только вы получите данные результатов из API randomuser, вам просто нужно создать этот объект узла и передать его функции createNode()
.
Здесь мы сопоставляем результаты, так как вы хотели получить 500 случайных пользователей https://randomuser.me/api/?results=500
.
Создайте объект userNode
с обязательными и желаемыми полями. Вы можете добавить больше полей в зависимости от того, какие данные вы хотите использовать в своем приложении.
Просто создайте узел с функцией createNode()
API Гэтсби.
2) Запросите свои данные с помощью GraphQL
После этого запустите gatsby develop
и перейдите к http://localhost:8000/___graphql.
Вы можете поиграть с GraphQL, чтобы создать свой идеальный запрос. Поскольку мы назвали internal.type
нашего объекта узла 'RandomUser'
, мы можем запросить allRandomUser
, чтобы получить наши данные.
{
allRandomUser {
edges {
node {
gender
name {
title
first
last
}
picture {
large
medium
thumbnail
}
}
}
}
}
3) Используйте этот запрос на своей странице Gatsby.
На своей странице, например src/pages/index.js
, используйте запрос и отобразите свои данные:
import React from 'react'
import Link from 'gatsby-link'
const IndexPage = (props) => {
const users = props.data.allRandomUser.edges;
return (
<div>
{users.map((user, i) => {
const userData = user.node;
return (
<div key={i}>
<p>Name: {userData.name.first}</p>
<img src={userData.picture.medium} />
</div>
)
})}
</div>
);
};
export default IndexPage
export const query = graphql`
query RandomUserQuery {
allRandomUser {
edges {
node {
gender
name {
title
first
last
}
picture {
large
medium
thumbnail
}
}
}
}
}
`;
Вот и все!
person
Nenu
schedule
16.03.2018
componentDidMount()
, не вfetch
, я не уверен, что я четко объяснюсь). Боюсь, что на данный момент нет универсального плагина, который можно было бы использовать для настраиваемых вызовов REST API. - person Miguel Calderón   schedule 15.03.2018