Я копаю graphql
, поэтому я следовал учебнику, и я застрял в этой части.
Home. js
function Home() {
const {
loading,
data: { getPosts: posts } // <===## Here ##
} = useQuery(FETCH_POSTS_QUERY);
return (
<div>
{loading ? (
<h1>Loading posts..</h1>
) : (
posts &&
posts.map((post) => (
<p>
{post.content}
</p>
))
)}
</div>
);
}
const FETCH_POSTS_QUERY = gql`
{
getPosts {
id
content
}
}
`;
export default Home;
resolver
Query: {
async getPosts() {
try {
const posts = await Post.find().sort({ createdAt: -1 });
return posts;
} catch (err) {
throw new Error(err);
}
}
},
Весь код: https://github.com/hidjou/classsed-graphql-mern-apollo/tree/react10
В приведенном выше примере работает хорошо, и использовать его используйте data: { getPosts: posts }
для деконструкции возвращаемых данных. но в моем коде я следовал ему, но я получил ошибку
TypeError: Невозможно прочитать свойство 'getPosts' из неопределенного
Вместо этого, если я кодирую, как показано ниже,
function Home() {
const {
loading,
data // <===## Here ##
} = useQuery(FETCH_POSTS_QUERY);
if(loading) return <h1>Loading...</h1>
const { getPosts: posts } = data // <===## Here ##
return (
<div>
{loading ? (
<h1>Loading posts..</h1>
) : (
posts &&
posts.map((post) => (
<p>
{post.content}
</p>
))
)}
</div>
);
}
Работает хорошо. Похоже, мой код пытается сослаться на data
до его загрузки. Но я не знаю, почему это произошло. Код почти такой же. Разные вещи 1. my code is on nextjs
, 2. my code is on apollo-server-express
. Другие вещи почти такие же, мой распознаватель использует async/await
и вернет posts
. Я что-то пропустил?
мой распознаватель, как показано ниже.
Query: {
async getPosts(_, { pageNum, searchQuery }) {
try {
const perPage = 5
const posts =
await Post
.find(searchQuery ? { $or: search } : {})
.sort('-_id')
.limit(perPage)
.skip((pageNum - 1) * perPage)
return posts
} catch (err) {
throw new Error(err)
}
},