2017-06-29 1 views
0

Meine Komponente ruft eine Subskriptionsabfrage auf, aber aus irgendeinem Grund wird nicht auf den Subskriptionsauflöser zugegriffen: Ein Breakpoint darin ist nie aktiviert. Und dennoch bekomme ich auf dem Client den GraphQL-Abonnement-Fehler:Apollo Subscription Resolver wird nie aktiviert?

Was könnte das verursachen?

Vielen Dank im Voraus für alle Informationen.

Abo QUERY

const IM_SUBSCRIPTION_QUERY = gql` 
     subscription getIMsViaSubscription($fromID: String!, $toID: String!){ 
      IMAdded(fromID:$fromID, toID: $toID){ 
      id, 
      fromID, 
      toID, 
      msgText, 
      myUserData{ 
       id, 
       name_first, 
       name_last, 
       picture_large, 
       picture_medium, 
       picture_thumbnail 
       my_category 
      } 
      } 
     } 
`; 

RESOLVER

Subscription: { 
    IMAdded(IMThatWasAdded) { 
     debugger; <== IS NEVER ACTIVATED 
     subscribe: withFilter(() => SubscriptionServer.pubsub.asyncIterator(IM_ADDED_CHANNEL), (newIM, args) => { 
      const callIsFromMsgFoldersComponent = args.toID == 0; 
      var result; 
      if (callIsFromMsgFoldersComponent){ 
       result = (newIM.fromID === args.fromID || newIM.toID === args.fromID); 
      } else { 
       result = ((newIM.fromID === args.fromID && newIM.toID === args.toID) || (newIM.fromID === args.toID && newIM.toID === args.fromID)); 
      } 
      return result; 
     }) 

COMPONENT

const withDataAndSubscription = graphql(GETIMS_QUERY, { 
    options({toID}) { 
     console.log(GETIMS_QUERY); 
     const fromID = Meteor.userId(); 
     return { 
      fetchPolicy: 'cache-and-network', 
      variables: {fromID: `${fromID}`, toID: `${toID}`} 
     }; 
    } 
    , 
    props: props => { 
     debugger; 
     return { 
      loading: props.data.loading, 
      instant_message: props.data.instant_message, 
      subscribeToMore: props.data.subscribeToMore, 
      subscribeToNewIMs: params => { 
       debugger; <==IS ACTIVATED AS EXPECTED 
       console.log(IM_SUBSCRIPTION_QUERY); <==IS OKAY 
       const fromID = Meteor.userId(); 
       const toID = params.toID; 
       return props.data.subscribeToMore({ 
        document: IM_SUBSCRIPTION_QUERY, 
        variables: {fromID: `${fromID}`, toID: `${toID}`}, 
        updateQuery: (previousResult, {subscriptionData}) => { 
         if (!subscriptionData.data) { 
          return previousResult; 
         } 
         const newMsg = subscriptionData.data.createIM; 
         return update(previousResult, { 
          instant_message: { 
           $push: [newMsg], 
          }, 
         }); 
        } 
       }); 
      } 
     }; 
    }, 
}) 
; 
+0

haben Sie eine Instanz des Dienstes 'pubsub' initialisiert? Haben Sie eine console.log in der Server-Subskriptionsfunktion versucht? –

+0

Danke für diesen Eingang. Tatsächlich stellte sich heraus, dass das Server-Setup geändert werden musste. Ich poste mit dem serverseitigen Code, der es behoben hat. – VikR

Antwort

0

Server-sid Das Setup und die Mutations-/Subskriptions-Resolver haben sich seit dem Code in meinem Beitrag, der auf Apollo-Bibliotheken von Ende letzten Jahres basierte, ziemlich verändert. Hier ist Code, der mit aktuellen Apollo Libs arbeitet, über this tutorial:

Server Setup

import express from 'express'; 
import { graphqlExpress, graphiqlExpress } from 'graphql-server-express'; 
import bodyParser from 'body-parser'; 
import cors from 'cors'; 
import { execute, subscribe } from 'graphql'; 
import { createServer } from 'http'; 
import { SubscriptionServer } from 'subscriptions-transport-ws'; 

import schema from '/imports/api/schema'; 

//SET UP APOLLO QUERY/MUTATIONS/PUBSUB 
const METEOR_PORT = 3000; 
const GRAPHQL_PORT = 4000; 
const server = express(); 

server.use('*', cors({ origin: 'http://localhost:${METEOR_PORT}' })); 

server.use('/graphql', bodyParser.json(), graphqlExpress({ 
    schema 
})); 

server.use('/graphiql', graphiqlExpress({ 
    endpointURL: '/graphql', 
    subscriptionsEndpoint: `ws://localhost:${GRAPHQL_PORT}/subscriptions` 
})); 

// Wrap the Express server 
const ws = createServer(server); 
ws.listen(GRAPHQL_PORT,() => { 
    console.log(`GraphQL Server is now running on http://localhost:${GRAPHQL_PORT}`); 
    // Set up the WebSocket for handling GraphQL subscriptions 
    new SubscriptionServer({ 
     execute, 
     subscribe, 
     schema 
    }, { 
     server: ws, 
     path: '/subscriptions', 
    }); 
}); 
//END OF SET UP APOLLO PUBSUB 

MUTATIONS RESOLVER

Mutation: { 
     createIM(root, args, context) { 
      var associatedUsers = []; 
      associatedUsers.push(args.fromID); 
      associatedUsers.push(args.toID); 
      var IDofNewIM; 

      return Promise.resolve() 
       .then(() => { 
        const newIM = connectors.IMs.create(args); 
        return newIM; 
       }) 
       .then(IMAdded => { 
        // publish subscription notification 
        pubsub.publish(IM_ADDED_CHANNEL, { IMAdded, args}); 
        return IMAdded; 
       }) 
       .catch((err)=> { 
        console.log(err); 
       }); 
     }, 

Abo RESOLVER

IMAdded: { 
    subscribe: withFilter(
     () => pubsub.asyncIterator(IM_ADDED_CHANNEL), 
     (IMAdded, args) => { 
      IMAdded = IMAdded.IMAdded; 
      var result = ((IMAdded.fromID === args.fromID && IMAdded.toID === args.toID) || (IMAdded.fromID === args.toID && IMAdded.toID === args.fromID)); 
      return result; 
     } 
    ) 
},