Pubsub publi sh несколько событий Apollo Server - PullRequest
1 голос
/ 14 февраля 2020

Я использую Apollo Server и хочу опубликовать sh 2 события в строке от одного и того же преобразователя. Обе подписки работают нормально , но только если я отправляю только одно событие . Если я пытаюсь отправить оба, второй распознаватель подписки никогда не вызывается. Если я закомментирую первую отправку события, вторая работает нормально.

const publishMessageNotification = async (message, me, action) => {
  const notification = await models.Notification.create({
    ownerId: message.userId,
    messageId: message.id,
    userId: me.id,
    action,
  });

 // if I comment out this one, second pubsub.publish starts firing
  pubsub.publish(EVENTS.NOTIFICATION.CREATED, {
    notificationCreated: { notification },
  });

  const unseenNotificationsCount = await models.Notification.find({
    ownerId: notification.ownerId,
    isSeen: false,
  }).countDocuments();

  console.log('unseenNotificationsCount', unseenNotificationsCount);// logs correct value

  // this one is not working if first one is present
  pubsub.publish(EVENTS.NOTIFICATION.NOT_SEEN_UPDATED, {
    notSeenUpdated: unseenNotificationsCount,
  });
};

Я использую стандартную реализацию pubsub. В консоли нет ошибок.

import { PubSub } from 'apollo-server';

import * as MESSAGE_EVENTS from './message';
import * as NOTIFICATION_EVENTS from './notification';

export const EVENTS = {
  MESSAGE: MESSAGE_EVENTS,
  NOTIFICATION: NOTIFICATION_EVENTS,
};

export default new PubSub();

1 Ответ

0 голосов
/ 18 февраля 2020

Убедитесь, что вы используете pubsub из контекста сервера apollo, например:

Сервер:

const server = new ApolloServer({
  schema: schemaWithMiddleware,
  subscriptions: {
    path: PATH,
    ...subscriptionOptions,
  },
  context: http => ({
    http,
    pubsub,
    redisCache,
  }),
  engine: {
    apiKey: ENGINE_API_KEY,
    schemaTag: process.env.NODE_ENV,
  },
  playground: process.env.NODE_ENV === 'DEV',
  tracing: process.env.NODE_ENV === 'DEV',
  debug: process.env.NODE_ENV === 'DEV',
});

и пример использования в resolver по контексту:

...
const Mutation = {
  async createOrder(parent, { input }, context) {
    ...
    try {
       ...
        context.pubsub.publish(CHANNEL_NAME, {
          newMessage: {
            messageCount: 0,
          },
          participants,
        });
        dialog.lastMessage = `{ "orderID": ${parentID}, "text": "created" }`;
        context.pubsub.publish(NOTIFICATION_CHANNEL_NAME, {
          notification: { messageCount: 0, dialogID: dialog.id },
          participants,
        });
        ...
      }
      return result;
    } catch (err) {
      log.error(err);
      return sendError(err);
    }
  },
};
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...