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