GatsbyJS получение данных из RESTful API
Я новичок как в 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, чтобы фильтровать и сортировать пользователя и т. д......
не могли бы вы помочь мне найти образец как я могу получить данные и вставить их в GraphQL на gatsby-node.js
2 ответов
если вы хотите использовать GraphQL для извлечения данных, вам нужно создать sourceNode. ДОК о создание исходного плагина может помочь вам.
выполните следующие действия, чтобы иметь возможность запрашивать данные randomuser с graphQL в проекте Gatsby.
1) создание узлов в Гэтсби-узле.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
объяснение:
цель состоит в том, чтобы создать каждый узел для каждой части данных, которые вы хотите использовать. Согласно документация createNode, вы должны предоставить объект с несколькими обязательными полями (id, parent, internal, children).
как только вы получите данные от API randomuser, вам просто нужно создать этот объект узла и передать его
большое спасибо, это отлично работает для меня, я меняю только небольшие части gastbyjs-узла.js поскольку он делает ошибку при использовании sync & await, я думаю, что мне нужно изменить какой-то раздел процесса сборки, чтобы использовать 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();
});
});
}