GraphQL 订阅:调用 apolloClient.subscribe 时出错
Posted
技术标签:
【中文标题】GraphQL 订阅:调用 apolloClient.subscribe 时出错【英文标题】:GraphQL subscriptions: Error on calling apolloClient.subscribe 【发布时间】:2017-08-08 11:03:17 【问题描述】:我认为我的后端订阅设置正确。我在客户端使用 angular,当我尝试调用 subscribe
时出现错误
passwordUpdatedSubscription = gql`
subscription passwordUpdatedpasswordUpdatedname password
`;
// Apollo Subscription
var subscription = this.apollo.subscribe(
query: this.passwordUpdatedSubscription
);
subscription.subscribe(
next(data)
console.log(data);
,
error(err) console.error('err', err); ,
);
然后这是控制台中出现的错误
"type":"subscription_fail","id":0,"payload":"errors":["message":"Cannot read property 'subscribe' of undefined"]
也许我在后端遗漏了一些东西?我需要在SubscriptionManager
中定义setupFunctions
吗?
这是我的订阅管理器
const sub = require('graphql-subscriptions');
const pubSub = new sub.PubSub();
const manager = new sub.SubscriptionManager(
schema,
pubSub
);
这是我在 graphQL 中的架构
const graphql = require('graphql');
var schema = graphql.buildSchema(`
type Subscription
passwordUpdated: User
type Mutation
setMessage(message: String): String,
updateUserPassword(userName: String, password: String): User!
type Query
getMessage: String,
getUsers: [User],
findUsers(userName: String): [User]
type User
name: String,
password: String
`);
【问题讨论】:
错误告诉你在这个上下文中未定义 apollo 客户端。你已经检查了吗? @Locco0_0,我已经检查过了。它不是未定义的。watchQuery
和 mutation
等其他操作正在运行
好的,所以请在服务器上显示订阅管理器。您使用哪些节点包?我猜你错过了设置功能。您使用哪种发布订阅方式?
@Locco0_0,更新了我的问题
【参考方案1】:
是的,您缺少设置功能。您可以查看此链接 graphql subscription docu 或 example。
您的订阅管理器可能如下所示:
const manager = new sub.SubscriptionManager(
schema,
pubSub,
setupFunctions:
passwordUpdated: (options, args) => ( // name of your graphQL subscription
passwordUpdatedChannel: // name of your pubsub publish-tag
filter: () =>
return true
,
,
),
,
);
当你调用 pubsub 发布函数时,你必须这样写 pubsub.publish("passwordUpdatedChannel")
。
Sidenode:您可能希望将更改密码的用户的 ID 添加到订阅中。如果你这样做,你可以将它添加到过滤器选项中,看起来像这样filter: (user) => return user.id === args.userId
【讨论】:
谢谢!它解决了问题!以上是关于GraphQL 订阅:调用 apolloClient.subscribe 时出错的主要内容,如果未能解决你的问题,请参考以下文章