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

GraphQL Playground持续触发服务端context函数问题咨询

你的问题拆解与解决方案

首先给你吃个定心丸:用Apollo Client消费API的时候完全不用担这个心!

为什么Playground会疯狂触发context查询?

GraphQL Playground这个调试工具,打开标签页后会一直保持活跃状态,默认会每隔一段时间自动发送introspection查询(就是用来获取你的Schema结构、实现界面自动补全的请求)。每次请求都会走一遍你的context逻辑,所以才会每秒都输出User.findByPk的查询日志——这纯粹是调试工具的特性,和生产环境的实际调用场景完全不一样。

Apollo Client的实际表现

Apollo Client只会在你主动发起业务请求(比如查询用户数据、提交表单的mutation操作)的时候才会向服务器发送请求,而且每个请求只会触发一次context函数,不会像Playground那样无意义地重复调用。正常业务场景下,绝不会出现这种每秒重复查询的情况,完全不会影响系统扩展性。

可选优化:给用户查询加缓存

虽然生产环境没影响,但如果你看着Playground的重复日志难受,或者想进一步提升性能,可以给getUser函数加个缓存层,避免重复查询同一个用户。比如用lru-cache做内存缓存:

import LRU from 'lru-cache';

// 配置缓存:最多存100个用户信息,5分钟后自动过期
const userCache = new LRU({ max: 100, ttl: 5 * 60 * 1000 });

export const getUser = async (authorization, User) => {
  const token = authorization.replace('Bearer ', '');
  try {
    // 先查缓存,命中直接返回
    if (userCache.has(token)) {
      return userCache.get(token);
    }

    const { id, email } = jwt.verify(token, process.env.JWT_SECRET_KEY);
    const user = await User.findByPk(id);
    if (!user) return null;
    
    const userInfo = { id, email };
    // 存入缓存,后续同token请求直接复用
    userCache.set(token, userInfo);
    return userInfo;
  } catch (error) {
    return null;
  }
};

另外,你也可以在Playground的设置里(右上角齿轮图标)调整introspection相关配置,关闭自动刷新,但这只是调试时的小优化,没必要过度纠结。

总之,生产环境用Apollo Client不会有这个问题,放心开发就好!

内容的提问来源于stack exchange,提问作者benard-kong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:47:31