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

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;
    }
  },
};

修正说明

  1. 正确获取用户数据:通过await context.db.User.find({})异步查询数据库,拿到真实的用户文档数组。
  2. 利用数据库原生过滤:直接在MongoDB查询中指定lifeStyle.strick_diet条件,比内存过滤更高效,尤其适合大数据量场景。
  3. 匹配Schema返回类型:直接返回查询到的用户数组,完全符合[User]的类型要求。
  4. 处理边界值:判断filter.strick_diet是否为undefined,避免传入false时被错误跳过。

内容的提问来源于stack exchange,提问作者pelotador.1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:01:19