Nextjs 13 - 刷新 SSG 问题

问题描述 投票:0回答:1

我在简单数据页面上刷新数据时遇到一些问题。该场景很简单:我有一个显示类别数据的页面和另一个编辑相同数据的页面。当我编辑并重定向回列表页面时,我希望列表使用新数据进行更新。由于它是静态站点生成 (SSG) 页面,因此它是在构建时构建的,从而产生静态数据。

import prismadb from "@/lib/prismadb";
import CategoriesClient from "./components/client";

export const dynamic = "force-dynamic";

export default async function Categories(res) {
  let categories;
  categories = await prismadb.category.findMany({
    orderBy: {
      createdAt: "desc",
    },
  });

  const formattedCategories = categories.map((category) => ({
    id: category.id,
    name: category.name,
    isActive: category.isActive,
  }));

  return (
    <>
      <CategoriesClient data={formattedCategories} />
    </>
  );
}
  async function onSubmit(data) {
    try {
      setLoading(true);
      if (initialData) {
        await axios.patch(`/api/categories/${params.categoryId}`, data);
      } else {
        await axios.post(`/api/categories`, data);
      }
      router.refresh();
      router.push(`/categories`);
      toast.success(successMessage);
    } catch (err) {
      toast.error(`An error as occurred: ${err.response.data}`);
    } finally {
      setLoading(false);
    }
  }

我尝试在列表页面上使用重新验证属性,但它仅适用于硬刷新,不适用于我正在使用的路由器。

export const revalidate = 1;

目前,我有force-dynamic来使页面动态化。问题是,当我使用路由器或 Next.js 链接重定向到页面时,它工作正常。但是,当我使用 F5 手动刷新页面或手动输入链接时,我收到 500 错误(仅当我在产品环境中,在 Netlify 中。在本地计算机上工作正常)。

有没有办法解决这个问题,保证页面在所有场景下都能正确更新,包括手动刷新?

你能帮我解决这个问题吗?我被困在这个问题上好几天了..

javascript next.js netlify next.js13
1个回答
0
投票

静态站点生成的目的之一是速度,通过在客户请求时向客户呈现现成的页面。并且 next/router 不会进行硬重新加载来保留单页应用程序属性。

所以,我认为你有两个解决方案: 1- 保留静态站点生成并在客户端进行更改,同时调用此页面的重新验证。 您可以使用重新验证 api 而不是使用重新验证密钥来执行此操作,如本示例

export default async function handler(req, res) {
  // Check for secret to confirm this is a valid request
  if (req.query.secret !== process.env.MY_SECRET_TOKEN) {
    return res.status(401).json({ message: 'Invalid token' })
  }
 
  try {
    // this should be the actual path not a rewritten path
    // e.g. for "/blog/[slug]" this should be "/blog/post-1"
    await res.revalidate('/path-to-revalidate')
    return res.json({ revalidated: true })
  } catch (err) {
    // If there was an error, Next.js will continue
    // to show the last successfully generated page
    return res.status(500).send('Error revalidating')
  }
}

并且每当用户做出会影响页面的更改时调用此 api 您可以在此处查看完整详细信息 https://nextjs.org/docs/pages/building-your-application/data-fetching/incremental-static-regenesis 然后在客户端,使用 useEffect 钩子并使用空依赖数组调用其中的数据 api,以在路由器刷新时调用

2-如果修改频繁,请使用服务器端渲染而不是静态生成

© www.soinside.com 2019 - 2024. All rights reserved.