Prisma Client查询返回空数组问题求助
问题排查:Prisma查询返回空数组
1. 确认数据库表是否存在数据
直接使用SQL Server管理工具执行以下查询,验证Scales表是否有数据:
SELECT * FROM [RiffTheoryScales].[dbo].[Scales];
如果查询结果为空,问题出在数据库无数据;如果有数据,继续排查。
2. 核对日志与当前请求的匹配性
你提供的日志中显示的查询语句带有WHERE [dbo].[Scales].[ID] = @P1,但控制器代码调用的是无过滤条件的prisma.scales.findMany(),说明这条日志不是当前测试请求产生的。建议在控制器中添加调试日志,确认实际执行的查询:
const getScaleByName = async (req, res) => { try { console.log("Starting findMany query for Scales"); const scales = await prisma.scales.findMany() console.log("Query result:", scales) // 后续逻辑 } catch (error) { // 错误处理 } }
重新发起请求后,查看日志是否输出不带WHERE条件的SELECT [dbo].[Scales].[ID], [dbo].[Scales].[name] FROM [dbo].[Scales],如果没有,说明请求未进入该控制器逻辑。
3. 修正空数据判断逻辑
findMany()在无匹配数据时返回空数组而非null,JavaScript中空数组的布尔值为true,因此当前的if (!scales)永远不会触发。需改为判断数组长度:
if (scales.length === 0) { res.status(400).json({ success: false, message: 'No scales found!', }); } else { res.status(200).json({ scales, success: true, message: 'All scales returned' }) }
4. 检查Prisma模型与数据库的映射一致性
- 显式指定表名映射,避免自动映射异常:
model Scales { ID Int @id(map: "PK__Scales__3214EC27E22038C6") @default(autoincrement()) name String @db.NVarChar(100) @@map("Scales") // 明确绑定数据库表名 } - 重新执行
prisma db pull同步模型,再执行prisma generate更新Prisma Client,确保模型与数据库结构完全匹配。
5. 确保PrismaClient实例正确初始化
开发环境热重载可能导致重复实例化PrismaClient,改为单例模式避免异常:
import { PrismaClient } from '@prisma/client' let prisma; if (process.env.NODE_ENV === 'production') { prisma = new PrismaClient({ log: ['query', 'info', 'warn', 'error'], }); } else { if (!global.prisma) { global.prisma = new PrismaClient({ log: ['query', 'info', 'warn', 'error'], }); } prisma = global.prisma; } // 服务器其他代码 export default prisma
6. 验证请求路径是否正确
你的路由配置为/api/scales/name,确保测试时使用的完整请求URL为:
GET http://localhost:3000/api/scales/name
路径错误会导致请求无法触发目标控制器逻辑。
内容的提问来源于stack exchange,提问作者ShyRell
相关产品推荐
相关产品推荐

