pet*_*ete 8 javascript node.js next.js prisma next.js13
我使用 Next.js 13 和 Prisma ORM 来获取服务器组件中的数据,并通过上下文将其提供给子组件。路由的结构如下:/item/[id]
,并且在layout.tsx文件中使用id来获取数据。
初始页面加载时,将获取数据并通过上下文供所有子组件访问。但是,在修改上下文中的数据(并通过 API 调用在数据库中更新数据)时,我遇到了问题。当导航到新页面然后返回上一页时,将显示初始加载的旧数据。服务器端函数getChildItems
应在每次页面加载时执行,仅在页面刷新时运行,而不是在来回导航期间运行。我可以在进行更改时使用router.refresh()
,next/navigation
但我认为这不是最佳选择。
由于这是一个服务器组件,我无法使用像 useEffect 这样的钩子。可以从 api 获取客户端组件中的数据,但如果可能的话,我想在服务器上呈现页面。
这是我的layout.tsx:
import { Item } from "@prisma/client";
import { ListProvider } from "~/context/list-context";
import { db } from "~/lib/db"; // Prisma ORM database connection
// This should run every time when navigating to /items/[id] but currently runs only on page refresh
async function getChildItems(itemId: Item["id"]) {
return await db.item.findMany({
where: {
parent_id: itemId,
},
});
}
export default async function ListLayout(params) {
const items = await getChildItems(params.id);
return (
<ListProvider listId={params.id} items={items}>
<div>{children}</div>
</ListProvider>
);
}
Run Code Online (Sandbox Code Playgroud)
我确信 Next.js 正在缓存此页面,但我还没有找到一种方法来使实际工作的服务器组件的缓存失效。
提前感谢您的帮助!
编辑:如果需要,这是数据库代码:
import { PrismaClient } from "@prisma/client";
import { deletedAt } from "../prismaMiddleware";
declare global {
// eslint-disable-next-line no-var
var cachedPrisma: PrismaClient;
}
let prisma: PrismaClient;
if (process.env.NODE_ENV === "production") {
prisma = new PrismaClient();
} else {
if (!global.cachedPrisma) {
global.cachedPrisma = new PrismaClient();
}
prisma = global.cachedPrisma;
}
prisma.$use(deletedAt);
export const db = prisma;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3549 次 |
最近记录: |