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

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

Это мой менеджер подписки

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

person Anthony C    schedule 17.03.2017    source источник
comment
ошибка сообщает вам, что клиент apollo в этом контексте не определен. Вы это уже проверяли?   -  person Locco0_0    schedule 17.03.2017
comment
@ Locco0_0, я это проверил. это не было неопределенным. Другие операции, такие как watchQuery и mutation, работают, хотя   -  person Anthony C    schedule 17.03.2017
comment
Хорошо, покажите, пожалуйста, Диспетчер подписок на сервере. И какие пакеты узлов вы используете? И я думаю, вам не хватает функции настройки. Какой вид публикации-подписки вы используете?   -  person Locco0_0    schedule 17.03.2017
comment
@ Locco0_0, обновил мои вопросы   -  person Anthony C    schedule 17.03.2017


Ответы (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}

person Locco0_0    schedule 18.03.2017
comment
Спасибо! Это устранило проблему! - person Anthony C; 18.03.2017