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

Next.js v13中如何避免重复获取同一数据?

解决Next.js中generateMetadata与Page组件重复查询数据库的问题

你可以通过React.cache缓存数据获取逻辑,让同一个请求周期内的两次调用复用同一份查询结果,避免重复执行数据库请求。

具体实现步骤

  1. 用React.cache包裹数据库连接和查询逻辑,确保相同参数的调用会复用缓存结果
  2. 在generateMetadata和Page组件中统一调用缓存后的函数

修改后的代码示例:

import { cache } from 'react';

// 缓存数据库连接逻辑,避免重复创建连接
const connectToPostgres = cache(async () => {
  // 你的原有数据库连接逻辑
});

// 缓存查询逻辑,相同slug只会执行一次查询
const getQuestion = cache(async (questionSlug: string) => {
  const sql = await connectToPostgres();
  return findQuestion(sql, questionSlug);
});

export const generateMetadata = async ({
  params: { questionSlug },
}: Props): Promise<Metadata> => {
  const question = await getQuestion(questionSlug);

  if (!question) {
    return {};
  }

  return {
    alternates: {
      canonical: `https://ray.run/questions/${question.slug}`,
    },
    title: question.question,
  };
};

const Page = async ({ params: { questionSlug } }: Props) => {
  const question = await getQuestion(questionSlug);

  if (!question) {
    return notFound();
  }

  // ... 页面渲染逻辑
};

原理说明

React.cache会为函数参数生成唯一缓存键,在同一个服务器请求周期(或客户端渲染的同一次页面加载)中,相同参数的函数调用会直接返回之前缓存的Promise结果,不会重复执行数据库查询和连接操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 21:47:40