如果您想使用GraphQL获取数据,必须创建一个sourceNode
。有关创建源插件的文档可以帮助您。
按照以下步骤,在Gatsby项目中使用GraphQL查询randomuser
数据。
1)在gatsby-node.js中创建节点
在您的根项目文件夹中,将以下代码添加到gatsby-node.js
中:
const axios = require('axios');
const crypto = require('crypto');
exports.sourceNodes = async ({ actions }) => {
const { createNode } = actions;
const fetchRandomUser = () => axios.get(`https://randomuser.me/api/?results=500`);
const res = await fetchRandomUser();
res.data.results.map((user, i) => {
const userNode = {
id: `${i}`,
parent: `__SOURCE__`,
internal: {
type: `RandomUser`,
},
children: [],
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,
}
}
const contentDigest = crypto
.createHash(`md5`)
.update(JSON.stringify(userNode))
.digest(`hex`);
userNode.internal.contentDigest = contentDigest;
createNode(userNode);
});
return;
}
我使用了axios
来获取数据,所以你需要安装它:npm install --save axios
Explanation:
目标是为要使用的每个数据创建一个节点。
根据createNode文档,您必须提供一个具有几个必需字段(id、parent、internal、children)的对象。
一旦您从randomuser API获得结果数据,您只需创建此节点对象并将其传递给createNode()
函数。
在这里,我们按照您想要获取500个随机用户的结果进行映射https://randomuser.me/api/?results=500
。
使用所需和想要的字段创建userNode
对象。您可以添加更多字段,具体取决于您想在应用程序中使用的数据。
只需使用Gatsby API的createNode()
函数创建节点。
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
}
}
}
}
}
`;
就是这样!
componentDidMount()
中,也不是与fetch
一起使用,我不确定我是否表达清楚)。恐怕目前还没有通用的插件可用于自定义REST API调用。 - Miguel Calderón