0

我正在为 ssr 使用 nextJS 和 urqlClient。目前我的所有页面都关闭了 ssr。我面临的问题如下。我有个人资料页面,它在从 graphql 获取用户后呈现数据。如果找不到用户,它将路由器推送用户登录。我面临的问题是,当我使用 localhost:3000/profile 手动转到浏览器中的配置文件页面时,突变在第一次渲染时返回未定义,而在第二次渲染时返回对象。

但是,如果我使用 NavBar 组件访问配置文件页面,<NextLink href="/profile">则突变会在第一次渲染时返回对象,并且数据会正确显示。我感觉它与 SSR 有关,因为当我重新加载页面时,console.log("profile page", data);它会在服务器端触发,但当我使用导航栏时它不是。

我将所有页面都包裹在 urqlclient 中

export default withUrqlClient(createUrqlClient, { ssr: false })(Profile);

这是个人资料页面的代码。

const [{ data, fetching }] = useMeQuery({ pause: isServer() });
  console.log("profile page", data);

  useEffect(() => {
    if (!data?.me) {
      router.push("/auth");
    }
  });
4

1 回答 1

0

因此,我通过确保在获取查询时不会触发 router.push() 方法来解决此问题,并且我添加了 useEffect 的依赖项。这是正确的做法。它与SSR无关。

  useEffect(() => {
    if (!fetching && !data?.me) {
      router.push("/auth");
    }
  },[fetching,data,router]);
于 2022-02-01T18:25:57.700 回答