我想知道graphql订阅的工作示例

我想知道graphql订阅的工作示例,graphql,subscriptions,Graphql,Subscriptions,最近,他们已经弃用了subscriptionManager。我想知道如何设置解析器、定义订阅和执行函数。您需要升级到Apollo 2.0。由于官方文档尚未更新,我最近就如何使用Apollo 2.0进行了一次讨论 简而言之,您现在必须在客户机上使用apollo链接,然后从graphql包执行和订阅,然后直接传递到订阅服务器 您首先需要具有正确版本的正确软件包: npm install --save apollo-client@beta apollo-cache-inmemory@beta apol

最近,他们已经弃用了subscriptionManager。我想知道如何设置解析器、定义订阅和执行函数。

您需要升级到Apollo 2.0。由于官方文档尚未更新,我最近就如何使用Apollo 2.0进行了一次讨论

简而言之,您现在必须在客户机上使用
apollo链接
,然后从
graphql
包执行
订阅
,然后直接传递到
订阅服务器

您首先需要具有正确版本的正确软件包:

npm install --save apollo-client@beta apollo-cache-inmemory@beta apollo-link@0.7.0 apollo-link-http@0.7.0 apollo-link-ws@0.5.0 graphql-subscriptions subscriptions-transport-ws apollo-server-express express graphql graphql-tools body-parser
如果您正在运行Meteor,您可能还需要:

meteor add apollo swydo:blaze-apollo swydo:graphql webapp
下面的代码是在Meteor中编写的,但是它可以很容易地适应其他服务器类型,比如Express。您还可以下载一个

在客户机上:
从“apollo客户端”导入{apollo客户端};
从“阿波罗链接”导入{apollo链接};
从“阿波罗链接http”导入{HttpLink};
从“apollo link ws”导入WebSocketLink;
从“apollo Cache inmemory”导入缓存;
从“graphql”导入{getOperationAST};
常量httpUri=http://localhost:3000/graphql';
const wsUri='ws://localhost:3000/subscriptions';
const link=ApolloLink.split(
操作=>{
const-operationAST=getOperationAST(operation.query,operation.operationName);
return!!operationAST&&operationAST.operation=='subscription';
},
新WebSocketLink({
uri:wsUri,
选项:{
重新连接:true,//自动重新连接
////携带登录状态(使用此状态时应使用安全WebSocket(wss))
//连接参数:{
//authToken:localStorage.getItem(“Meteor.loginToken”)
// }
}
}),
新的HttpLink({uri:httpUri})
);
常量缓存=新缓存(窗口状态);
const客户端=新客户端({
链接
隐藏物
});
在服务器上:
从'meteor/WebApp'导入{WebApp};//流星特异性
从“graphql”导入{execute,subscribe};
从“订阅传输ws”导入{SubscriptionServer};
从“meteor/apollo”导入{CreateAppolloServer,addCurrentUserToContext};//特定于Meteor,但您始终可以查看Express实现
从“graphql工具”导入{makeExecutableSchema};
从“./resolvers”;/”导入解析程序您的自定义解析程序
从“./schema.graphql”;/”导入typeDefs您的自定义模式
//使模式可执行
const schema=makeExecutableSchema({
typeDefs,
解析器
});
//为解析器使用的任何其他上下文(如果有)
const context={};
//使用Express启动graphql服务器,以处理可能的Meteor当前用户
//如果你没有使用Meteor,请查看https://github.com/apollographql/apollo-server 有关如何在纯节点中创建服务器的说明,请参见
创建服务器({
模式,
上下文
}, {
////允许跨域访问GraphQL API(需要NPM“cors”包)
//configServer:expressServer=>expressServer.use(cors())
});
//创建订阅服务器
//此处的非Meteor实现:https://github.com/apollographql/subscriptions-transport-ws
新订阅服务器({
模式,
执行,,
订阅
////关于连接订阅生命周期事件
//onConnect:async(connectionParams,webSocket)=>{
////如果meteor登录令牌从客户端传递到连接参数,
////将当前用户添加到订阅上下文
//const subscriptionContext=connectionParams.authToken
//?等待addCurrentUserToContext(上下文、connectionParams.authToken)
//:背景;
//返回subscriptionContext;
// }
}, {
服务器:WebApp.httpServer,
路径:'/subscriptions'
});
resolvers.js
从“graphql订阅”导入{withFilter};//将缩小订阅所听的更改的范围
从“graphql订阅”导入{PubSub};
从“../imports/api/collections”;/”导入{People}Meteor专用于数据库查询
const pubsub=新的pubsub();
常量解析程序={
查询:{
人员(对象、参数、上下文){
const person=People.findOne(args.id);
如果(人){
//Mongo将id存储为_id,但是我们的GraphQLAPI调用id,所以要使它符合API
person.id=person.\u id;
删除人。\u id;
}
返回人;
}
},
突变:{
updatePerson(对象、参数、上下文){
//您可能希望首先在生产环境中验证参数,并可能使用上下文检查用户凭据
更新({u id:args.id},{$set:{name:args.name,eyeColor:args.eyeColor,occulation:args.occulation});
publish(“personUpdate”,{personUpdate:args});//触发对此人的所有订阅的更改
//注意:必须使用嵌套在对象中的订阅名称发布对象!
//见:https://github.com/apollographql/graphql-subscriptions/issues/51
返回args;
}
},
订阅:{
人员更新:{
//见:https://github.com/apollographql/graphql-subscriptions#channels-映射
//请看一看用于处理多个创建、更新和删除事件的“通道映射”
//此外,请查看“PubSub实现”,了解如何使用Redis而不是PubSub
//不建议将PubSub用于生产,因为如果您有多个服务器,它将无法工作
//withFilter使您只能侦听此人而不是所有人的更改
订阅:withFilter(()=>pubsub.asyncIterator('PersonUpdate'),(有效负载,参数)=>{
返回(payload.personUpdated.id==args.id);
})
}
}
};
导出默认解析器;
schema.graphql
enum EyeColor{
棕色的
蓝色
绿色
榛子
}
类型人{
id:id
名称:String
眼睛颜色:眼睛颜色
职业:弦
}
类型查询{
person(id:id!):person
}
类型突变{
updatePerson(id:id!,name:String!,eyeColor:eyeColor!,职业:String!):个人
}
类型订阅{
P