Apollo过滤查询返回null而非预期值的问题排查
排查返回null的原因及修复方案
核心问题梳理
你的代码存在多处逻辑错误,导致无法正确返回用户数据,最终Apollo返回null:
未获取实际用户数据
let users = context.db.User赋值的是数据库模型(如Mongoose Model),不是真实的用户文档集合。必须通过异步查询(如find())获取数据库中的用户数据,且需使用await处理异步操作。错误的属性访问逻辑
let lifeStylefilter = users.lifeStyle完全错误:若users是模型,它不存在lifeStyle属性;若users是用户数组,每个用户对象才有lifeStyle数组,不能直接从数组层面获取该属性。过滤逻辑失效
你试图对lifeStylefilter(实际为undefined)调用filter方法,会直接导致逻辑中断,无法得到有效数据。返回值不符合Schema定义
Schema中filter查询的返回类型是[User](用户数组),但你返回的是{ firstName: users.firstName },结构完全不匹配,Apollo无法解析,最终返回null。
修正后的Resolver代码
import User from '../../models/User.js'; import { requireAuth } from '../../services/auth.js'; export default { filter: async(parent, args, context, info) => { try { const { filter } = args; // 无过滤条件时返回所有用户 if (!filter) { return await context.db.User.find({}); } // 构建数据库查询条件 const query = {}; if (filter.strick_diet !== undefined) { // 查询lifeStyle数组中存在目标strick_diet值的用户 query['lifeStyle.strick_diet'] = filter.strick_diet; } // 执行查询并返回符合条件的用户数组 return await context.db.User.find(query); } catch (error) { throw error; } }, };
修正说明
- 正确获取用户数据:通过
await context.db.User.find({})异步查询数据库,拿到真实的用户文档数组。 - 利用数据库原生过滤:直接在MongoDB查询中指定
lifeStyle.strick_diet条件,比内存过滤更高效,尤其适合大数据量场景。 - 匹配Schema返回类型:直接返回查询到的用户数组,完全符合
[User]的类型要求。 - 处理边界值:判断
filter.strick_diet是否为undefined,避免传入false时被错误跳过。
内容的提问来源于stack exchange,提问作者pelotador.1
相关产品推荐
相关产品推荐

