Next.js+Prisma中数组查询返回空值问题求助
问题描述
在Next.js中调用接口时,followerUsers返回空数组,但确认对应数据存在。已知followerIds不为空且数据正确,怀疑最后一次查询中的in操作符使用有误。附上相关代码请求排查:
import { NextResponse } from "next/server"; import { getServerAuthSession } from "~/server/auth"; import { prisma } from "~/server/db/prisma"; export async function GET(request: Request) { const { searchParams } = new URL(request.url); const username = searchParams.get("username"); console.log("username", username); try { const user = await prisma.user.findUnique({ where: { username, }, }); console.log("user", user); const userId: string = user?.id; const followers = await prisma.user.findUnique({ where: { id: userId, }, include: { followers: true, }, }); console.log("followers", followers); const followerIds = followers?.followers.map((follower) => follower.id); console.log("followerIds", followerIds); const followerUsers = await prisma.user.findMany({ where: { id: { in: followerIds, }, }, }); console.log("followerUsers", followerUsers); return NextResponse.json({ status: 200, data: followers }); } catch (error: unknown) { return NextResponse.json({ status: 500, message: `Internal server error: ${error}`, }); } }
问题排查与解决
类型不匹配问题:检查
followerIds的元素类型是否和数据库中user.id的类型一致。比如数据库id是数字类型,但followerIds里是字符串,会直接导致in查询匹配失败。可以在map时做类型转换,比如parseInt(follower.id)(根据实际类型调整)。空值兜底处理:虽然你确认
followerIds不为空,但followers?.followers可能因followers为空导致followerIds变成undefined,显式兜底能避免in操作符接收非法值:const followerIds = followers?.followers.map(follower => follower.id) || [];关联查询逻辑优化:你当前分三次查询的方式既冗余又容易出错,直接用Prisma的嵌套关联查询一步到位更可靠,还能提升性能:
// 假设你的User模型中,followers是关联到关注者的中间表,关联字段为follower const userWithFollowerUsers = await prisma.user.findUnique({ where: { username }, include: { followers: { include: { follower: true } } } });具体字段名需要根据你的Prisma Schema定义调整,这样能直接拿到完整的关注者用户数据,无需手动处理ID数组。
验证
in操作符有效性:Prisma完全支持in操作符接收非空数组,只要数组内容合法就没问题。可以打印followerIds的具体值和类型,和数据库中的id字段做对比,确认是否存在格式或类型差异。
内容的提问来源于stack exchange,提问作者user20068680
相关产品推荐
相关产品推荐

