首页 > web前端 > js教程 > 正文

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

紅蓮之龍
发布: 2025-10-04 14:39:02
原创
964人浏览过
使用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-wssubscriptions-transport-ws是主流选择。推荐使用更现代、轻量且兼容性更好的graphql-ws库,配合expressgraphql构建完整服务。

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);

注意:executesubscribe来自graphql模块,需导入:

ViiTor实时翻译
ViiTor实时翻译

AI实时多语言翻译专家!强大的语音识别、AR翻译功能。

ViiTor实时翻译 116
查看详情 ViiTor实时翻译
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-wsurql等库连接。示例使用原生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?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号