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
相关产品推荐
相关产品推荐

