如何使用Prisma查询当前登录用户对应service表的标题数据
实现方案
核心修正点
- 你当前使用的
getStaticProps是静态构建方法,仅在项目编译时执行一次,无法获取每个访问用户的动态登录session,需要替换为服务端渲染方法getServerSideProps,它会在每次用户请求时在服务端执行,可获取请求上下文里的登录态。 - 你用了
findUnique查询单条数据,但单用户可能对应多条service记录,且你后续用了map遍历数组,需要替换为findMany查询多条数据。
完整修改代码
首先导入next-auth的getSession方法用于服务端获取session:
import React from 'react'; import { PrismaClient } from '@prisma/client'; import { signIn, signOut, useSession, getSession } from 'next-auth/client'; // 替换原来的getStaticProps为getServerSideProps export async function getServerSideProps(context) { const prisma = new PrismaClient(); // 从请求上下文获取当前登录用户的session const session = await getSession(context); let services = []; if (session) { // 筛选关联用户ID和当前登录用户ID一致的service记录 // 注意:如果你的service表关联用户的外键字段名不是userId,替换为你实际的字段名即可 services = await prisma.service.findMany({ where: { userId: session.user.id }, // 只查需要的id、title字段,优化查询性能 select: { id: true, title: true } }) } return { props: { services, }, }; } export default function Home({ services }) { const [session] = useSession(); return ( <> {!session && ( <> Not signed in <br /> <button type="button" onClick={signIn}>Sign In</button> </> )} {session && ( <> Signed in as {session.user.email} <br /> <ul> {services.map((service) => ( <li key={service.id}>{service.title}</li> ))} </ul> </> )} </> ) }
Prisma模型校验
确保你的schema.prisma里的Service模型有关联用户的外键字段,示例参考:
model Service { id Int @id @default(autoincrement()) title String userId Int // 关联用户表的id字段 user User @relation(fields: [userId], references: [id]) } model User { id Int @id @default(autoincrement()) email String @unique services Service[] }
内容的提问来源于stack exchange,提问作者Julia Cassemiro
相关产品推荐
相关产品推荐

