我有一个带有API端点的Next应用程序,用于编辑资源(使用基于页面的系统,而不是基于应用程序的系统).除了在编辑资源后,当我go 查看(或重新编辑)它时,我看到的是旧版本之外,一切都很好.

在查阅了文档后,我似乎可以使用revalidatePath告诉NEXT来清除该路由的缓存.然而,当我try 使用它时,就像这样:

// pages/api/resource.js

const handler = async (request, response) => {
    const id = await saveStuff(request);
    revalidatePath(`/resource/[name]`);
    revalidatePath(`/resource/[name]/edit`);
    response.send(JSON.stringify({ id }));
}

我得到一个关于completely different函数的错误:revalidateTag.

> Error: Invariant: static generation store missing in revalidateTag
> /resource/[name]
>     at revalidateTag (/home/me/project/next/node_modules/next/dist/server/web/spec-extension/revalidate-tag.js:15:15)
>     at revalidatePath (/home/me/project/next/node_modules/next/dist/server/web/spec-extension/revalidate-path.js:13:45)
>     at handler (webpack-internal:///(api)/./pages/api/resource.js:83:67)
>     at process.processTicksAndRejections (node:internal/process/task_queues:95:5)

我以前从来没有用过revalidatePath,所以我可能不知何故用错了,但我不知道我可以做什么来导致这个错误.或者,如果有其他机制可以强制NeXT清除特定页面的缓存,这也会很有帮助.

EDIT:

我查看了源代码,似乎有revalidatePath个调用revalidateTag(以路径为标记).错误来自以下代码的末尾:

function revalidateTag(tag) {
  const staticGenerationAsyncStorage = fetch.__nextGetStaticStore == null ? void 0 : fetch.__nextGetStaticStore();
      const store = staticGenerationAsyncStorage == null ? void 0 : staticGenerationAsyncStorage.getStore();
      if (!store || !store.incrementalCache) {
          throw new Error(`Invariant: static generation store missing in revalidateTag ${tag}`);
      }

换句话说,看起来fetch上没有staticGenerationAsyncStorage,这表明Next还没有修补功能.但是这段代码是从API路由函数调用的,所以看起来NeXT应该已经有机会修补fetch了?

推荐答案

事实证明,这只是与Next.js文档的混淆(不幸的是,当您在寻找新的/旧的Next信息时,通过Google很容易找到Next.js文档页面,而没有意识到它适用于旧/新的Next).

在本例中,独立的revalidatePath只适用于app个目录页/路由.对于pages条目录路由,您需要使用:

response.revalidate(path);

Javascript相关问答推荐

如何避免使用ajax在Vue 3合成API中重定向

添加/删除时React图像上传重新渲染上传的图像

在JavaScript中检索一些文本

积分计算和 colored颜色 判断错误

获取加载失败:获取[.]添加时try 将文档添加到Firerestore,Nuxt 3

有什么(最佳)方法可以从模块中获取脚本模块的多姆元素吗?

无法在nextjs应用程序中通过id从mongoDB删除'

如何让npx在windows中运行js脚本?

无法访问Vue 3深度监视器中对象数组的特定对象值'

我怎么才能得到Kotlin的密文?

无法使用单击按钮时的useState将数据从一个页面传递到另一个页面

如何在文本字段中输入变量?

我在Django中的视图中遇到多值键错误

TypeError:无法分解';React2.useContext(...)';的属性';basename';,因为它为空

基于props 类型的不同props ,根据来自接口的值扩展类型

Reaction Redux&Quot;在派单错误中检测到状态Mutations

有没有一种直接的方法可以深度嵌套在一个JavaScript对象中?

在没有任何悬停或其他触发的情况下连续交换图像

无法向甜甜圈图表上的ChartJSImage添加可见标签

将匿名函数附加到链接的onClick属性