You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Next.js getServerSideProps中用react-query处理多脱水查询

问题解决:Next.js + React Query 多请求服务端预取

你的问题根源在于创建了两个独立的QueryClient实例,但客户端只hydrate了第一个实例的状态,第二个实例的预取数据根本没被客户端的QueryClient读取到,所以微软授权链接只能在客户端重新发起请求后才拿到数据。

正确实现方式

只需要使用单个QueryClient实例管理所有预取请求,统一进行hydration即可:

// Packages
import { dehydrate, QueryClient } from '@tanstack/react-query';

// Hooks
import { useGetGoogleAuthUrl, useGetMicrosoftAuthUrl } from '../hooks/auth';
import { getGoogleAuthUrl, getMicrosoftAuthUrl } from '../hooks/auth/api';

export async function getServerSideProps({ req, res }) {
  const queryClient = new QueryClient();
  
  // 并行预取两个请求,提升服务端获取效率
  await Promise.all([
    queryClient.prefetchQuery(['getGoogleAuthUrl'], getGoogleAuthUrl),
    queryClient.prefetchQuery(['getMicrosoftAuthUrl'], getMicrosoftAuthUrl)
  ]);

  return {
    props: {
      dehydratedState: dehydrate(queryClient),
    },
  };
}

export default function Signin() {
  const date = new Date();
  const { data: googleAuthData } = useGetGoogleAuthUrl();
  const { data: microsoftAuthData } = useGetMicrosoftAuthUrl();

  console.log(googleAuthData); // 挂载时立即输出预取数据
  console.log(microsoftAuthData); // 挂载时同样立即输出预取数据
  

  return (
    // 页面内容
  );
}

核心要点

  • React Query的服务端hydration基于单个QueryClient实例,所有预取的查询缓存都需要存在同一个实例中
  • 使用Promise.all并行执行多个预取请求,避免串行等待浪费时间
  • 客户端的自定义hooks(useGetGoogleAuthUrl、useGetMicrosoftAuthUrl)会自动匹配查询键,从hydrate后的缓存中读取数据,无需额外修改

关于多请求预取的支持

完全支持。React Query本身就设计了支持批量预取多个查询,只要所有预取操作都基于同一个QueryClient实例,最后统一导出dehydrated状态即可。

内容的提问来源于stack exchange,提问作者Idris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:11:07