2016-10-26 2 views
3

Nouveau à Apollo, alors j'ai décidé de prendre le most simple example I found et essayer de le travailler d'une manière légèrement différente. Mon code peut être found here. Le problème que j'ai est que l'abonnement ne semble pas être appelé quand j'appelle la mutation createTask(). La mutation et d'abonnement sont définis dans schema.graphql comme:Apollo abonnement ne semble pas être appelé Mutation

type Mutation { 
    createTask(
    text: String! 
): Task 
} 

type Subscription { 
    taskCreated: Task 
} 

Et resolvers.js comme:

Mutation: { 
    createTask(_, { text }) { 
    const task = { id: nextTaskId(), text, isComplete: false }; 
    tasks.push(task); 
    pubsub.publish('taskCreated', task); 
    return task; 
    }, 
}, 
Subscription: { 
    taskCreated(task) { 
    console.log(`Subscript called for new task ID ${task.id}`); 
    return task; 
    }, 
}, 

Ce que je me attends arriver est que je recevrais un console.log dans la serveur chaque fois que je cours ce qui suit dans le client:

mutation Mutation($text: String!) { 
    createTask(text:$text) { 
    id 
    text 
    isComplete 
    } 
} 

Mais rien ne se passe. Qu'est-ce que je rate?

+0

Happen pour savoir quel était le problème? – Justin

+0

Je souhaite que je l'ai fait. N'a pas eu le temps d'enquêter non plus. – CodeChimp

+0

Ayant le même problème: c – kayla

Répondre

0

La fonction de résolution d'abonnement est appelée lorsqu'il existe réellement un abonnement à l'abonnement GraphQL.

Comme vous n'avez pas ajouté un client qui utilise subscriptions-transport-ws et le SubscriptionClient pour vous abonner à votre socket Web et l'abonnement cela ne fonctionnera pas.

Ce que vous pouvez faire est d'ajouter l'abonnement à la chaîne setupFunctions du SubscriptionManager et y vous obtenez la valeur que la fonction pubsub.publish offre.

pourrait ressembler à ceci:

... 
 

 
const WS_PORT = 8080; 
 

 
const websocketServer = createServer((request, response) => { 
 
    response.writeHead(404); 
 
    response.end(); 
 
}); 
 

 
websocketServer.listen(WS_PORT,() => console.log(// eslint-disable-line no-console 
 
    `Websocket Server is now running on http://localhost:${WS_PORT}` 
 
)); 
 

 
const subscriptionManager = new SubscriptionManager({ 
 
    schema: executableSchema, 
 
    pubsub: pubsub, 
 
    setupFunctions: testRunChanged: (options, args) => { 
 
    return { 
 
     taskCreated: { 
 
     filter: (task) => { 
 
      console.log(task); // sould be log when the pubsub is called 
 
      return true; 
 
     } 
 
     }, 
 
    }; 
 
    }, 
 
    , 
 
}); 
 

 
subscriptionServer = new SubscriptionServer({ 
 
    subscriptionManager: subscriptionManager 
 
}, { 
 
    server: websocketServer, 
 
    path: '/', 
 
}); 
 

 
...