如果要使用GraphQL获取数据,则必须创建sourceNode。关于的文件 创建源插件 可以帮到你。
按照以下步骤,可以在Gatsby项目中使用graphQL查询随机用户数据。
在根项目文件夹中,将此代码添加到 gatsby-node.js :
gatsby-node.js
const axios = require('axios'); const crypto = require('crypto'); exports.sourceNodes = async ({ boundActionCreators }) => { const { createNode } = boundActionCreators; // 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
axios
npm install --save axios
目标是为您想要使用的每个数据创建每个节点。 根据 createNode文档 ,你必须提供一个包含很少必填字段的对象(id,parent,internal,children)。
从randomuser API获取结果数据后,您只需创建此节点对象并将其传递给 createNode() 功能。
createNode()
在这里,我们映射到您希望获得500个随机用户的结果 https://randomuser.me/api/?results=500 。
https://randomuser.me/api/?results=500
创造 userNode 具有必填字段和所需字段的对象。 您可以根据要在应用中使用的数据添加更多字段。
userNode
只需用。创建节点 createNode() Gatsby API的功能。
一旦你这样做,运行 gatsby develop 然后去 HTTP://本地主机:8000 / ___ graphql 。
gatsby develop
您可以使用graphiQL来创建完美的查询。正如我们所说的那样 internal.type 我们的节点对象 'RandomUser' ,我们可以查询 allRandomUser 获取我们的数据。
internal.type
'RandomUser'
allRandomUser
{ allRandomUser { edges { node { gender name { title first last } picture { large medium thumbnail } } } } }
例如,在您的页面中 src/pages/index.js ,使用查询并显示您的数据:
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 } } } } } `;
这就对了 !
非常感谢,这对我来说很好,我只更改了gastbyjs-node.js的一小部分,因为它在使用sync&amp; amp时会出错。等待,我想我需要更改构建过程的某些部分以使用babel来允许我使用sync或await。
这是适合我的代码。
const axios = require('axios'); const crypto = require('crypto'); // exports.sourceNodes = async ({ boundActionCreators }) => { exports.sourceNodes = ({boundActionCreators}) => { const {createNode} = boundActionCreators; return new Promise((resolve, reject) => { // fetch raw data from the randomuser api // const fetchRandomUser = () => axios.get(`https://randomuser.me/api/?results=500`); // await for results // const res = await fetchRandomUser(); axios.get(`https://randomuser.me/api/?results=500`).then(res => { // 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); }); resolve(); }); }); }
上面给出的答案工作,除了步骤2中的查询似乎只为我返回一个节点。我可以通过添加totalCount作为边缘的兄弟来返回所有节点。即
{ allRandomUser { totalCount edges { node { id gender name { first last } } } } }