GraphQL订阅:调用apolloClient.subscribe的错误
我想我的后端订阅设置正确。我使用的角度在客户端上,当我尝试打电话subscribe
我得到一个错误GraphQL订阅:调用apolloClient.subscribe的错误
passwordUpdatedSubscription = gql`
subscription passwordUpdated{passwordUpdated{name 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
?
这是我SubscriptionManager
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
}
`);
模式是你缺少的设置功能。你可以看看这个链接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}
谢谢!它解决了问题! –
错误是告诉你,在这种情况下apollo客户端是未定义的。你已经检查过吗? –
@ Locco0_0,我已检查过。它不是没有定义的。其他操作如'watchQuery'和'mutation'正在工作,虽然 –
好,所以请在服务器上显示Subscription Manager。你使用哪个节点包?我想你错过了设置功能。你使用什么样的发布订阅? –