如果你有 apollo react 钩子从后端获取数据,你如何使用 nextjs 进行服务器端渲染?
Posted
技术标签:
【中文标题】如果你有 apollo react 钩子从后端获取数据,你如何使用 nextjs 进行服务器端渲染?【英文标题】:How do you do server side rendering with nextjs if you have apollo react hooks to fetch data from backend? 【发布时间】:2021-07-20 14:32:06 【问题描述】:我有一个 nextjs 项目,它使用 apollo graphql 从后端获取数据。我正在尝试使用服务器端渲染来渲染我的页面。但我目前正在使用 graphql apollo react hooks 从后端获取我的数据,react hooks 阻止我在 getServerSideProps 中调用我的后端。
我该如何解决这个问题?
import * as React from "react";
import useExampleQuery from "graphql/types";
export const getServerSideProps = async ( params ) =>
// Here we should probably call graphql function that is now called inside Page
return props: hash: params.hash ;
;
const Page = ( hash ) =>
/*
I am currently calling my graphql query here using apollo react hooks,
that are generated inside graphql/types using @graphql-codegen (typescript)
*/
const data, loading = useExampleQuery(
variables:
hash: hash,
,
);
return loading ? <p>loading</p> : <p>data.example.text</p>;
;
export default Page;
【问题讨论】:
【参考方案1】:getServerSideProps
是一个服务器端函数,所以你不能完全调用它里面的 apollo 查询钩子。
一种方法是使用apollo客户端实例查询方法。
请参阅下面的示例代码。
import gql from '@apollo/client';
import apolloClient from '/path/to/graphql/server/client';
// Example Query
const EXAMPLE_QUERY = gql`
query EXAMPLE_QUERY($hash: String!)
exampleQuery(hash: $hash)
...
`;
export const getServerSideProps = async ( params ) =>
const data = await apolloClient.query(
query: EXAMPLE_QUERY,
variables: hash: params.hash ,
);
return
props:
hash: params.hash,
data,
,
;
;
另外,如果导入你的 apollo 客户端服务器实例有点不清楚,你可以使用这个 graphql-request
包在给定 URL 的情况下发出 graphql 请求。
查看示例
import GraphQLClient from "graphql-request";
// Replace GRAPHQL_URL below to actual
const client = new GraphQLClient(<GRAPHQL_URL>);
export const getServerSideProps = async ( params ) =>
const data = await client.request(EXAMPLE_QUERY,
hash: params.hash
);
return
props:
hash: params.hash,
data,
,
;
;
【讨论】:
谢谢,真的很有帮助!因此,正如您所说,我正在尝试创建一个新的 graphql 客户端,但我收到“网络错误:对localhost:3001/graphql 的请求失败,原因:连接 ECONNREFUSED 127.0.0.1:3001”。你知道问题可能是什么吗?我可以访问其他网址。在我的 initApollo 文件中初始化 apollo 客户端时,我没有收到该错误,但我无法从我的 initApollo 内部访问客户端 导出在您的initApollo
文件中工作的客户端并在此处使用该实例。但是,我可以看看你是如何创建一个新的 graphql 客户端的吗? @Atonic以上是关于如果你有 apollo react 钩子从后端获取数据,你如何使用 nextjs 进行服务器端渲染?的主要内容,如果未能解决你的问题,请参考以下文章
获取更多功能未定义用于 useLazyQuery react-apollo 钩子
使用 React 钩子处理 graphQL 突变错误(useMutation + Apollo-client)
如何使用 Apollo 客户端 useQuery 钩子防止不必要的重新获取?
React Apollo - nodejs graphql后端返回异步响应后如何重新获取(更新)数据
如何在 React + Apollo GraphQL 中查询先前查询的结果?
如何将 React 钩子(useContext、useEffect)与 Apollo 反应钩子(useQuery)结合起来