pur*_*low 13 node.js server-side-rendering next.js
我正在尝试在某个事件中重新验证我网站的所有页面,
我遇到的问题是我必须一页一页地做:
...
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');
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:有没有一种方法可以按需(使用unstable_revalidate())重新验证我网站的所有页面,或者我是否必须逐页进行?
小智 2
Next.js 目前没有内置方法来一次重新验证所有页面。我创建了一个返回所有静态(例如index.js)和动态(例如[slug].js)页面的方法,如下所示:
export const getAllPages = async (): Promise<string[]> => {
const pages: PageInfo[] = [
"/",
"/about",
"/shop"
];
(await getProductUrls()).forEach(url=> pages.push(url));
return pages;
}
Run Code Online (Sandbox Code Playgroud)
就我而言,动态 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");
}
}
Run Code Online (Sandbox Code Playgroud)
由于 next.js 需要所有带有尾部和前导斜杠的 URL 进行重新验证,因此如果尚不存在,则将它们作为第一步添加。
希望这对您有帮助!
| 归档时间: |
|
| 查看次数: |
3190 次 |
| 最近记录: |