You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 07:57:07