私はReactとGatsbyJSの両方が初めてです。私は混乱しており、サードパーティのRestful APIからデータをロードする簡単な方法を理解できませんでした。
たとえば、randomuser.me/APIからデータを取得し、ページ内のデータを使用できるようにします。
このようなことを言ってみましょう:
import React from 'react'
import Link from 'gatsby-link'
class User extends React.Component {
constructor(){
super();
this.state = {
pictures:[],
};
}
componentDidMount(){
fetch('https://randomuser.me/api/?results=500')
.then(results=>{
return results.json();
})
.then(data=>{
let pictures = data.results.map((pic,i)=>{
return(
<div key={i} >
<img key={i} src={pic.picture.medium}/>
</div>
)
})
this.setState({pictures:pictures})
})
}
render() {
return (<div>{this.state.pictures}</div>)
}
}
export default User;
しかし、ユーザーなどをフィルタリングおよびソートするために、GraphQLの助けを借りたいと思います。
gatsby-node.js
でデータを取得してGraphQLに挿入する方法のサンプルを見つけるのを手伝ってもらえますか
GraphQLを使用してデータを取得する場合は、sourceNodeを作成する必要があります。 ソースプラグインの作成 に関するドキュメントが役立ちます。
GatsbyプロジェクトでgraphQLを使用してrandomuserデータをクエリできるようにするには、次の手順に従います。
ルートプロジェクトフォルダーで、このコードを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
目標は、使用するデータの各部分に対して各ノードを作成することです。 createNode documentation によると、いくつかの必須フィールド(id、parent、internal、children)を持つオブジェクトを提供する必要があります。
Randomuser APIから結果データを取得したら、このノードオブジェクトを作成し、createNode()
関数に渡すだけです。
ここでは、500人のランダムユーザーhttps://randomuser.me/api/?results=500
を取得したい結果にマッピングします。
必須フィールドと希望フィールドを含むuserNode
オブジェクトを作成します。アプリで使用するデータに応じて、フィールドを追加できます。
Gatsby APIのcreateNode()
関数でノードを作成するだけです。
それができたら、gatsby develop
を実行して http:// localhost:8000/___ graphql に移動します。
GraphiQLを使って完璧なクエリを作成できます。ノードオブジェクトinternal.type
の'RandomUser'
という名前を付けたので、allRandomUser
をクエリしてデータを取得できます。
{
allRandomUser {
edges {
node {
gender
name {
title
first
last
}
picture {
large
medium
thumbnail
}
}
}
}
}
たとえば、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
}
}
}
}
}
`;
それだ !
ありがとう同期または待機を使用します。
ここに私のために働くコードがあります。
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のクエリは1つのノードのみを返すようです。 totalCountをエッジの兄弟として追加することにより、すべてのノードを返すことができます。つまり.
{ allRandomUser { totalCount edges { node { id gender name { first last } } } } }
boundActionCreators
を使用すると非推奨の警告があることに注意するために、これに対する受け入れられた答えは非常に有効です。この警告を回避するには、これをactions
に名前変更する必要があります。