如何将额外数据附加到 Apollo Server 上的 GraphQL 响应

假设我们希望在每个 graphql 响应中包含唯一的请求标识符。

我们可以通过向查询类型添加 requestid 字段,然后将该字段解析为我们在每个请求的上下文中设置的某个唯一标识符来实现这一点。但这不是一个完美的解决方案,因为我们必须在客户端的每个请求中包含该字段,并且它会稍微增加发送到服务器的请求的大小。

有更好的方法!

我们可以创建一个小插件(中间件),将我们的自定义数据附加到响应正文的扩展字段。

apollo sandbox - screenshot

根据“创建 apollo 服务器插件”文档页面告诉我们的内容,我们的插件应如下所示:

// extensionsplugin.jsexport const extensionsplugin = () => {    return {        requestdidstart: () => {            return {                willsendresponse(requestcontext) {                    requestcontext.response.body.singleresult = {                        ...requestcontext.response.body.singleresult,                        extensions: {                            ...requestcontext.response.body?.extensions,                            requestid: requestcontext.contextvalue.requestid                        },                    };                },            }        }    }};

随意使用console.log(requestcontent.response)来了解数据的结构。

请记住,只有 body.singleresult 的扩展键可以开箱即用,因为它是 graphql 标准的一部分。我们无法将 requestid 直接添加到 body.singleresult。

现在我们只需实施它即可!

此示例使用 ulid 包生成紧凑且可按时间排序的 id。

// main.jsimport { ulid } from 'ulid';import { extensionsPlugin } from "./extensionsPlugin.js";// ...const server = new ApolloServer({    // ...    plugins: [extensionsPlugin()],    // ...})const { url } = await startStandaloneServer(server, {    // ...    context: async () => {        // ...        const requestId = ulid();        return {            requestId,        }    },    // ...})

就是这样!

为什么它有效?上下文是为每个请求单独构建的(上下文),并且始终可供处理该请求的所有解析器使用。最好在上下文中设置所有需要的变量,因为它是在触发任何插件挂钩之前创建的(例如:requestdidstart)。我们将 requestid 添加到我们的上下文中并使其在任何地方都可用,然后我们的插件从上下文中提取它并在发送回之前将其附加到响应正文。

知道我们还可以在我们的回复中附加什么内容吗?请在评论中分享:)

以上就是如何将额外数据附加到 Apollo Server 上的 GraphQL 响应的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1499906.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 22:08:46
下一篇 2025年12月19日 22:08:58

相关推荐

  • pr为什么序列号里面的视频挪动不了?怎么解决?

    pr为什么序列号里面的视频挪动不了?怎么解决?pr为什么序列号里面的视频挪动不了?怎么解决?pr为什么序列号里面的视频挪动不了?怎么解决?pr为什么序列号里面的视频挪动不了?怎么解决?

    在使用Premiere Pro进行视频剪辑时,常常会遇到时间线上某个视频片段无法拖动的问题。这虽然让人困扰,但大多数情况下并非软件出错,而是由于某些设置或模式被意外启用所致。 一、为何PR时间线中的视频无法移动? 当你发现序列里的视频素材不能随意拖拽时,通常是由以下几个常见原因造成的: 轨道被锁定在…

    2026年10月2日 • 用户投稿
    000
  • Node.js Workerpool 最佳实践:CPU密集型任务的资源管理策略

    Node.js Workerpool 最佳实践:CPU密集型任务的资源管理策略Node.js Workerpool 最佳实践:CPU密集型任务的资源管理策略Node.js Workerpool 最佳实践:CPU密集型任务的资源管理策略Node.js Workerpool 最佳实践:CPU密集型任务的资源管理策略

    本文探讨了在Node.js应用中高效管理CPU密集型任务的策略,特别是使用workerpool库时。核心观点是推荐使用一个单一的、集中管理的Worker Pool来处理所有不同类型的任务,而非为每种任务或路由创建独立的Pool。这种方法能有效避免资源过度竞争、优化CPU利用率,并简化资源管理,确保系…

    2026年10月2日 • 用户投稿
    000
  • 恶搞策略新作《Kingmakers》10月9日开放抢先测试:用枪炮爆杀中世纪!

    恶搞策略新作《Kingmakers》10月9日开放抢先测试:用枪炮爆杀中世纪!恶搞策略新作《Kingmakers》10月9日开放抢先测试:用枪炮爆杀中世纪!恶搞策略新作《Kingmakers》10月9日开放抢先测试:用枪炮爆杀中世纪!恶搞策略新作《Kingmakers》10月9日开放抢先测试:用枪炮爆杀中世纪!

    在去年2月,一款名为《kingmakers》的恶搞风格策略游戏发布了首支预告片,因其玩法中允许玩家使用ak47、装甲车乃至飞机大炮来碾压中世纪的“铁皮罐头”骑士,迅速被玩家们调侃为“骑马与开枪”。steam商店页面>>> 该游戏的抢先体验版本将于10月9日正式上线。近日,开发团队R…

    2026年10月2日 • 用户投稿
    100
  • win10文件资源管理器不断崩溃 win10文件资源管理器循环崩溃重启的解决之道

    win10文件资源管理器不断崩溃 win10文件资源管理器循环崩溃重启的解决之道win10文件资源管理器不断崩溃 win10文件资源管理器循环崩溃重启的解决之道win10文件资源管理器不断崩溃 win10文件资源管理器循环崩溃重启的解决之道win10文件资源管理器不断崩溃 win10文件资源管理器循环崩溃重启的解决之道

    文件资源管理器频繁崩溃通常由系统文件损坏、软件冲突或设置异常引起,可通过重启资源管理器进程、清除浏览历史、运行SFC和DISM修复工具、执行干净启动排查冲突软件、调整注册表超时设置及更新或回滚显卡驱动等方法解决。 如果您在使用Windows 10时,文件资源管理器频繁崩溃并自动重启,导致无法正常浏览…

    2026年10月2日 • 用户投稿
    200
  • javascript闭包怎么在WebSockets中应用

    javascript闭包怎么在WebSockets中应用javascript闭包怎么在WebSockets中应用javascript闭包怎么在WebSockets中应用javascript闭包怎么在WebSockets中应用

    javascript闭包通过封装上下文,在websockets中实现每个连接的独立状态管理;2. 利用闭包可将用户会话数据(如userid、连接状态)绑定到事件处理器,实现数据隔离与高效访问;3. 闭包提升事件监听器的可维护性与性能,通过自包含逻辑和减少运行时查找开销,使代码模块化且响应更快;4. …

    2026年10月2日 • 用户投稿
    000
  • java如何实现类之间的继承关系 java继承特性的应用操作指南

    java如何实现类之间的继承关系 java继承特性的应用操作指南java如何实现类之间的继承关系 java继承特性的应用操作指南java如何实现类之间的继承关系 java继承特性的应用操作指南java如何实现类之间的继承关系 java继承特性的应用操作指南

    java中实现类之间的继承关系,核心在于使用extends关键字,它允许子类继承父类的字段和方法,建立“is-a”关系,实现代码复用、多态性、扩展性和层次化设计;1. 使用extends关键字让子类继承父类,如class dog extends animal;2. 子类可通过super()调用父类构…

    2026年10月2日 • 用户投稿
    100
  • java代码怎样实现文件的复制与移动 java代码文件操作的进阶教程​

    java代码怎样实现文件的复制与移动 java代码文件操作的进阶教程​java代码怎样实现文件的复制与移动 java代码文件操作的进阶教程​java代码怎样实现文件的复制与移动 java代码文件操作的进阶教程​java代码怎样实现文件的复制与移动 java代码文件操作的进阶教程​

    java中实现文件复制与移动最推荐的方式是使用java.nio.file包下的files类,因其提供简洁、高效且功能丰富的api,支持权限、原子性及符号链接处理。2. 核心方法为files.copy()和files.move(),均接受源路径和目标路径的path对象,并可选standardcopyo…

    2026年10月2日 • 用户投稿
    100
  • WebGL的基本用法是什么

    WebGL的基本用法是什么WebGL的基本用法是什么WebGL的基本用法是什么WebGL的基本用法是什么

    答案:WebGL通过canvas获取渲染上下文,使用GLSL编写顶点和片元着色器,编译链接成程序后传递给GPU;顶点数据通过缓冲区对象从CPU传输到GPU,由属性变量解析,统一变量传递全局参数;渲染循环利用requestAnimationFrame逐帧清空缓冲、更新状态、设置着色器与数据,并调用绘制…

    2026年10月2日 • 用户投稿
    000
  • sublime执行html代码 sublime怎么在浏览器运行html

    sublime执行html代码 sublime怎么在浏览器运行htmlsublime执行html代码 sublime怎么在浏览器运行htmlsublime执行html代码 sublime怎么在浏览器运行htmlsublime执行html代码 sublime怎么在浏览器运行html

    sublime text不能直接运行html文件,因为它是一个文本编辑器而非浏览器或ide。1. 编写html代码并保存为.html文件;2. 通过双击或右键选择浏览器打开文件;3. 使用默认或指定浏览器查看效果。sublime text提供emmet插件、自动补全、代码高亮、多光标编辑和自定义代码…

    2026年10月2日 • 用户投稿
    100
  • Java集合框架怎样选择合适的集合初始化容量_Java集合框架性能优化的基础技巧

    Java集合框架怎样选择合适的集合初始化容量_Java集合框架性能优化的基础技巧Java集合框架怎样选择合适的集合初始化容量_Java集合框架性能优化的基础技巧Java集合框架怎样选择合适的集合初始化容量_Java集合框架性能优化的基础技巧Java集合框架怎样选择合适的集合初始化容量_Java集合框架性能优化的基础技巧

    选择java集合的初始化容量核心在于避免频繁扩容带来的性能开销。1. arraylist应根据预估元素数量n直接初始化为new arraylist(n),避免多次扩容复制;2. hashmap/hashset需结合负载因子(默认0.75)计算初始容量,公式为(int)(n / 0.75f) + 1,…

    2026年10月2日 • 用户投稿
    100
  • 关于iOS16.6正式版用户反馈的总结

    关于iOS16.6正式版用户反馈的总结关于iOS16.6正式版用户反馈的总结关于iOS16.6正式版用户反馈的总结关于iOS16.6正式版用户反馈的总结

    iOS 16.6续航提升约20%,发热降低至38℃,系统流畅稳定,信号增强,兼容老机型并修复16个安全漏洞,获用户广泛好评。 如果您正在考虑为您的设备升级系统,但对新版本的稳定性、续航和性能表现有所顾虑,可以参考大量用户的实际使用反馈。以下是关于iOS 16.6正式版用户反馈的详细总结。 本文运行环…

    2026年10月2日 • 用户投稿
    000
  • 豆包AI在哪里下载 官方下载渠道与安装指南

    本文旨在为您提供一份清晰的豆包AI下载与安装指南。我们将通过讲解如何准确找到官方下载渠道,并分步骤介绍详细的安装流程,帮助您安全、顺利地完成豆包AI的部署与设置,从而开始使用其提供的各项功能。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ …

    2026年10月2日
    000
  • 如何导出和导入JS模块

    如何导出和导入JS模块如何导出和导入JS模块如何导出和导入JS模块如何导出和导入JS模块

    js模块的导出和导入主要有两种方式:1. es模块(esm),使用export和import关键字,支持命名导出、默认导出及整体导入,适用于现代浏览器和node.js(需配置.type=”module”或使用.mjs扩展名);2. commonjs,使用module.expo…

    2026年10月2日 • 用户投稿
    000
  • ChatGPT如何开启对话历史 对话记录管理教程

    ChatGPT如何开启对话历史 对话记录管理教程ChatGPT如何开启对话历史 对话记录管理教程ChatGPT如何开启对话历史 对话记录管理教程ChatGPT如何开启对话历史 对话记录管理教程

    管理ChatGPT的对话历史对于保护个人信息和整理思路很有帮助。本文将通过详细的步骤,向您展示如何开启或关闭对话历史记录功能,并介绍如何对已保存的对话进行重命名和删除等管理操作,帮助您轻松掌控自己的对话数据。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R…

    2026年10月2日 • 用户投稿
    200
  • java使用教程怎样实现基于TCP的网络通信 java使用教程的TCP编程入门技巧​

    java使用教程怎样实现基于TCP的网络通信 java使用教程的TCP编程入门技巧​java使用教程怎样实现基于TCP的网络通信 java使用教程的TCP编程入门技巧​java使用教程怎样实现基于TCP的网络通信 java使用教程的TCP编程入门技巧​java使用教程怎样实现基于TCP的网络通信 java使用教程的TCP编程入门技巧​

    java中实现tcp通信需编写服务器端和客户端代码,服务器使用serversocket监听端口并接受连接,客户端通过socket连接服务器,双方通过输入输出流交换数据,tcp确保可靠、有序传输。1. 服务器端创建serversocket绑定端口,调用accept()阻塞等待客户端连接,每接受一个连接…

    2026年10月2日 • 用户投稿
    000
  • ChatGPT如何调整回答风格 个性化设置指南

    ChatGPT如何调整回答风格 个性化设置指南ChatGPT如何调整回答风格 个性化设置指南ChatGPT如何调整回答风格 个性化设置指南ChatGPT如何调整回答风格 个性化设置指南

    要让ChatGPT的回答更符合个人需求,并不需要复杂的设置,关键在于掌握如何通过提问来引导和塑造其输出风格。本文将介绍如何通过给出明确的指令,从角色设定、格式要求和语气风格三个层面,分步骤讲解如何定制化ChatGPT的回答,让您能够轻松获得更贴心、更具个性的互动体验。 ☞☞☞AI 智能聊天, 问答助…

    2026年10月2日 • 用户投稿
    100
  • 什么是LSM树?LSM树的层次结构

    什么是LSM树?LSM树的层次结构什么是LSM树?LSM树的层次结构什么是LSM树?LSM树的层次结构什么是LSM树?LSM树的层次结构

    lsm树通过将写入操作先缓存在内存的memtable中,再批量刷新到磁盘的sstables,并利用多层级结构和compaction机制,将随机写转化为顺序写,显著提升写入性能;其层次结构由内存中的memtable和immutable memtable,以及磁盘上分层的sstables组成,l0层允许…

    2026年10月2日 • 用户投稿
    000
  • 如何在Sublime Text中安装并切换不同的主题与配色方案?

    如何在Sublime Text中安装并切换不同的主题与配色方案?如何在Sublime Text中安装并切换不同的主题与配色方案?如何在Sublime Text中安装并切换不同的主题与配色方案?如何在Sublime Text中安装并切换不同的主题与配色方案?

    在sublime text中安装和切换主题与配色方案的步骤如下:1. 安装package control:通过控制台运行代码安装包管理器;2. 使用package control安装主题(如material theme)和配色方案(如monokai pro);3. 在preferences >…

    2026年10月2日 • 用户投稿
    000
  • Selenium Grid 4:指定节点运行测试用例

    Selenium Grid 4:指定节点运行测试用例Selenium Grid 4:指定节点运行测试用例Selenium Grid 4:指定节点运行测试用例Selenium Grid 4:指定节点运行测试用例

    本文旨在指导初学者如何在 Selenium Grid 4 环境中,通过配置节点和代码,实现将测试用例定向到特定节点运行。通过设置自定义 Capabilities,您可以精确控制测试执行的节点,从而满足特定测试需求,例如在特定版本的浏览器或特定操作系统上进行测试。 Selenium Grid 4 指定…

    2026年10月2日 • 用户投稿
    000
  • AI Overviews如何生成报告 数据可视化操作教学

    AI Overviews如何生成报告 数据可视化操作教学AI Overviews如何生成报告 数据可视化操作教学AI Overviews如何生成报告 数据可视化操作教学AI Overviews如何生成报告 数据可视化操作教学

    AI Overviews功能能够极大地提升报告撰写与数据分析的效率。本文将引导您了解如何利用AI功能,从原始数据出发,一步步生成结构化的分析报告,并通过指令完成数据可视化图表的创建。通过对数据准备、指令下达、内容生成及图表制作等关键环节的讲解,您可以掌握一套实用的操作流程。 ☞☞☞AI 智能聊天, …

    2026年10月2日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信