Подписки GraphQL: Ошибка при вызове apolloClient.subscribe

Я думаю, что у меня правильно настроена подписка на сервер. Я использую угловой на стороне клиента, когда я пытаюсь позвонить 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"}]}}

Может быть, мне чего-то не хватает на бэкэнде? Нужно ли мне определить setupFunctions в SubscriptionManager?

Это мой 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
    }
`);

1 ответ

Решение

Да, вам не хватает функции настройки. Вы можете взглянуть на эти ссылки подписки graphql или на примере.

Ваш менеджер подписки может выглядеть так:

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: вы можете добавить идентификатор пользователя, у которого пароль изменен, в подписку. Если вы сделаете это, вы можете добавить его к опции фильтра, может выглядеть так filter: (user) => {return user.id === args.userId}

Другие вопросы по тегам