如何用Node.js实现一个支持GraphQL订阅的实时API?


使用graphql-ws实现GraphQL订阅需结合WebSocket与发布-订阅模式。1. 安装express、graphql、ws、graphql-ws等依赖;2. 定义含Subscription类型的Schema并编写返回AsyncIterator的解析器;3. 用ws创建WebSocket服务器,通过useServer集成graphql-ws;4. 启动HTTP服务并可选添加express-graphql支持调试界面;5. 前端通过WebSocket连接发送订阅请求,服务端在Mutation中发布事件触发实时推送。关键在于路径一致与正确使用PubSub和AsyncIterator。

如何用node.js实现一个支持graphql订阅的实时api?

要实现一个支持GraphQL订阅的实时API,核心是使用WebSocket来建立持久连接,并结合GraphQL执行机制推送数据更新。Node.js生态中,graphql-ws和subscriptions-transport-ws是主流选择。推荐使用更现代、轻量且兼容性更好的graphql-ws库,配合express和graphql构建完整服务。

1. 安装必要依赖

先初始化项目并安装关键包:

npm init -y
npm install express graphql express-graphql ws graphql-ws

2. 定义GraphQL Schema和解析器

创建基本的Schema,包含查询和订阅类型:

const { buildSchema } = require('graphql');

const schema = buildSchema(` type Post { id: ID! title: String! content: String }

type Query { posts: [Post] }

type Subscription { postAdded: Post } `);

编写解析器,其中订阅返回一个AsyncIterator:

const posts = []; const { PubSub } = require('graphql'); const pubsub = new PubSub();

const resolvers = { Query: { posts: () => posts },
Subscription: { postAdded: { subscribe: () => pubsub.asyncIterator(['POST_ADDED']) } },
Mutation: { addPost: ({ title, content }) => { const post = { id: posts.length + 1, title, content }; posts.push(post); pubsub.publish('POST_ADDED', { postAdded: post }); return post; } } };

3. 配置WebSocket服务器支持订阅

使用ws创建WebSocket服务器,并通过graphql-ws处理订阅消息:

const express = require('express'); const { createServer } = require('http'); const { useServer } = require('graphql-ws/lib/use/ws'); const { WebSocketServer } = require('ws');

const app = express(); const server = createServer(app);

// 创建WebSocket服务器用于GraphQL订阅 const wss = new WebSocketServer({ server, path: '/graphql' });

useServer({ schema, execute, subscribe }, wss);

注意:execute和subscribe来自graphql模块,需导入:

ThinkPHP5.0完整版 ThinkPHP5.0完整版

ThinkPHP5.0版本是一个颠覆和重构版本,官方团队历时十月,倾注了大量的时间和精力,采用全新的架构思想,引入了更多的PHP新特性,优化了核心,减少了依赖,实现了真正的惰性加载,支持composer,并针对API开发做了大量的优化,包括路由、日志、异常、模型、数据库、模板引擎和验证等模块都已经重构,不适合原有3.2项目的升级,请慎重考虑商业项目升级,但绝对是新项目的首选(无论是WEB还是API

ThinkPHP5.0完整版 2228 查看详情 ThinkPHP5.0完整版 const { execute, subscribe } = require('graphql');

4. 启动HTTP和WebSocket服务

让Express处理普通请求,WebSocket处理实时通信:

server.listen(4000, () => { console.log('HTTP服务器运行在 http://localhost:4000'); console.log('WebSocket服务器已启动,路径 /graphql'); });

可选:添加express-graphql中间件支持浏览器调试:

const { graphqlHTTP } = require('express-graphql');

app.use('/graphql', graphqlHTTP({ schema, rootValue: resolvers, graphiql: true // 启用GraphiQL界面 }));

5. 前端测试订阅功能

在客户端使用graphql-ws或urql等库连接。示例使用原生WebSocket:

const ws = new WebSocket('ws://localhost:4000/graphql');

ws.onopen = () => { ws.send(JSON.stringify({ type: 'subscribe', payload: { query: `subscription { postAdded { id title content } }` } })); };

ws.onmessage = (event) => { console.log('收到新帖子:', JSON.parse(event.data)); };

当调用addPost mutation时,所有订阅客户端会立即收到更新。

基本上就这些。关键是把WebSocket和GraphQL执行流程打通,用发布-订阅模式触发实时推送。整个过程不复杂但容易忽略细节,比如路径一致性和AsyncIterator的正确使用。

以上就是如何用Node.js实现一个支持GraphQL订阅的实时API?的详细内容,更多请关注其它相关文章!


# 前端  # 相关文章  # 推荐使用  # 是一个  # 客户端  # 重构  # 可选  # 鼠标  # websocket  # app  # 浏览器  # node  # json  # node.js  # js  # 如何用  # 罗湖国内知名网站建设  # 恩平市seo服务  # 巢湖外贸网站建设  # 中山网站建站建设  # 江门推广业务员招聘网站  # 公司业务营销推广活动  # 简述网站建设的心得  # 曲靖网站网站建设  # 昆山 网站 建设  # 道滘餐饮店怎么推广营销  # 解决问题  # 中文网 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: CDR如何复制交互式填充色  《随手记》关闭首页消息推送方法  漫蛙漫画官方版直通入口 2025漫蛙漫画免注册访问说明  照片整理的黄金法则是怎样的? 理解“收集-筛选-归档-备份”四步流程  J*aScript模块加载器_RequireJS原理分析  PHP utf8_encode 字符编码转换疑难解析与最佳实践  OPPO手机参数配置如何开启护眼模式_OPPO手机参数配置护眼模式开启指南  鲨鱼剧场app金币获取方法  使用 J*aScript 随机化 CSS Grid 布局中的元素顺序  告别繁琐SEO!如何使用SyliusSitemap插件自动化生成网站地图,提升搜索引擎排名  背部总是隐隐作痛怎么回事 背痛如何改善  j*a中ArrayBlockingQueue的使用  附近酒吧怎么找?  4399小游戏下装链接 4399小游戏下载链接入口  铁路12306官网入口 铁路12306中国铁路官网登录首页  智慧团建活动报名入口 智慧团建活动报名入口手机端官网​  iPhone12是否要更新ios16  PyEZ 配置提交中 RpcTimeoutError 的健壮性处理策略  《宝可梦大集结》S4冠军之路开始时间介绍  抖音火山版如何进行提现  国际经济与贸易就业方向解析  AO3中文入口稳定分享_AO3官网HTTPS看文详解  《红果免费短剧》下载观看方法  深入理解随机递归函数的确定性:内部节点、叶节点与时间复杂度分析  纯CSS实现自适应宽度与响应式布局的水平按钮组  mysql中如何分析索引使用情况_mysql索引使用分析方法  响应式设计中动态背景颜色条的实现指南  Python中深度嵌套字典与列表的数据提取与条件过滤指南  yy漫画官方网站登录入口_yy漫画在线阅读页面地址  PHP 4 函数中引用参数的默认值限制与解决方案  Sublime怎么快速复制文件路径_Sublime右键菜单增强技巧  拷贝漫画2025网页版入口 拷贝漫画官网免费看全集  视频号视频怎么提取文案?提取的文案如何优化与使用?  谷歌浏览器怎么把网页翻译成中文_Chrome网页翻译功能使用方法  抖音作品被限流怎么办 抖音内容优化与流量恢复方法  搜狗浏览器如何查找页面中的文字 搜狗浏览器Ctrl+F页面搜索功能  抖音怎么解除第三方绑定_抖音解除第三方平台绑定方法介绍  lol小红书怎么|直播|?lol小红书|直播|是什么意思?  C#解析来自网络的XML流数据 实时错误处理与重试机制  word文档行距怎么调?word文档调行距的操作步骤  PHP中获取HTTP响应状态消息:方法与限制  猫眼app抢票快还是小程序快  c++如何链接Boost库_c++准标准库的集成与使用  Git命令与VS Code UI操作的对应关系解析  TikTok收藏夹无法删除视频如何解决 TikTok收藏管理优化方法  极兔快递官网查询入口手机版 手机极兔快递登录查询入口官方  创客贴登录页面入口 创客贴网页版最新网址链接  windows10怎么关闭自动安装应用_windows10禁止推广应用下载  《小宇宙》标记不友善评论方法  HTML与J*aScript实现下拉菜单驱动的动态表格:构建交互式维修表单 

 2025-10-04

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.