next.js 如何按需一次重新验证所有页面

dbf7pr2w  于 2023-06-22  发布在  其他
关注(0)|答案(1)|浏览(105)

我在尝试重新验证我网站上的所有页面,
问题是我必须一页一页地写

...
try {
 await res.unstable_revalidate(
  `/`
 );
 await res.unstable_revalidate(
  `/about`
 ;
 await res.unstable_revalidate(
  `/shop`
 );
 ...
 return res.json({ revalidated: true });
} catch (err) {
   return res.status(500).send('Error revalidating');
  }

所以我的问题是是否有一种方法可以按需(使用unstable_revalidate())重新验证我网站的所有页面,或者我必须逐页进行?

wko9yo5t

wko9yo5t1#

Next.js目前没有内置的方法来一次重新验证所有页面。我创建了一个方法,它返回所有静态(例如js)和动态(例如,[slug].js)页面,看起来像这样:

export const getAllPages = async (): Promise<string[]> => {
    const pages: PageInfo[] = [
        "/",
        "/about",
        "/shop"
    ];
    (await getProductUrls()).forEach(url=> pages.push(url));

    return pages;
}

在我的例子中,我无论如何都需要这个函数来创建一个动态的sitemap.xml。getProductUrls可以返回产品页面的动态页面URL,例如重新验证API路由如下所示:

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
    if (!req.query.secret || req.query.secret !== "SOME_SECRET_FOR_AUTORIZATION" || req.method !== "POST") {
        return res.status(401).end("Not Authorized");
    }

    try {
        const pages = await getAllPages();
        const prefixedPages = pages.map(p => p.startsWith("/") ? p : "/" + p);
        const suffixedPages = prefixedPages.map(p => p.endsWith("/") ? p : p + "/");
        await Promise.all(suffixedPages.map(async (page) => {
            try {
                await res.revalidate(page);
            } catch (e) {
                console.log(e)
            }
        }));
        return res.status(200).end("Revalidated");
    } catch (e) {
        return res.status(500).end("Error");
    }
}

由于next.js要求所有URL都带有一个尾随和一个前导斜杠以进行重新验证,因此如果还没有出现,则作为第一步添加这些URL。
希望这对你有帮助!

相关问题