Neverthrow 当包装在 Next.js 的不稳定_缓存中时,结果不起作用

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

我有这个代码

export const pageLoader = cache((slug: string) =>
  unstable_cache(
    async () => {
      return getPageBySlug(slug);
    },
    [slug],
    {
      revalidate: 10,
      tags: ["page"],
    }
  )()
);

getPageBySlug
返回
Promise<Result<...>
>

当尝试在服务器组件中使用它时

const result = await pageLoader(slug);

return result.match(
  (page) => (
    <div>
      <header>Header</header>
      <main>
        <h2>{page.title}</h2>
        <div>{page.content}</div>
      </main>
      <footer>Footer</footer>
    </div>
  ),
  (err) => {
    if (err.type === "NotFound") {
      notFound();
    }

    throw new Error(err.message);
  }
);

我收到一个未处理的运行时错误(尽管它在 TypeScript 中编译得很好):

“[服务器]错误:result.match不是一个函数”

如果只包装在缓存中它就可以正常工作,所以这与unstable_cache有关。

TypeScript 编译器不会抱怨并显示预期的类型 - 仅在运行时出现错误。

而且它不仅仅是

match
功能 - 它是所有功能
isErr
isOk
等。

next.js
1个回答
0
投票

似乎答案是在调用unstable_cache之前在加载器中最后一次使用neverthrow,因为unstable_cache缓存数据——而不是结果对象上的函数。我想您可以编写自己的缓存处理程序来保留这些内容,但这可能会以性能为代价。

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