0

J'utilise un serveur express avec des abonnements GraphQL et des abonnements-transport-ws.GraphQL-abonnements: Comment obtenir l'objet publié dans le résolveur d'abonnement

J'ai mis en place l'abonnement à un canal donné:

... 
 

 
const subscriptionManager = new SubscriptionManager({ 
 
    schema: executableSchema, 
 
    pubsub: pubsub, 
 
    setupFunctions: { 
 
    testRunChanged: (options, args) => { 
 
     return { 
 
     testRunChangedChannel: { 
 
      filter: (testRun) => { 
 
      return testRun.id === args.testRunId; 
 
      } 
 
     }, 
 
     }; 
 
    }, 
 
    }, 
 
}); 
 

 
...

Après une mutation est reçue un processus est démarré sur le serveur où l'entrée de la base de test est mis à jour Une fois terminé. Maintenant, lorsque la promesse de mise à jour pour l'action de base de données passe le client doit être informé.

Utilisation de la publier fonctionnalité de PubSub le gestionnaire d'abonnements obtient les informations sur l'exécution du test mis à jour:

... 
 

 
RunningTestDbService.setToFinished(testRun).then(updatedTestRun => { 
 
    pubsub.publish("testRunChangedChannel", updatedTestRun); 
 
    }) 
 

 
...

Une fois le gestionnaire d'abonnements filtres les abonnements en fonction du TestRun publié et souscrit testRunId La fonction de résolution d'abonnement est appelée. Pour mettre à jour le client, je dois récupérer le test mis à jour à nouveau.

Comment puis-je obtenir l'objet d'exécution de test publié dans la fonction de résolution d'abonnement?

L'abonnement et le look résolveur comme ceci:

... 
 

 
`testRunChanged(testRunId: ID!): TestRun!` 
 

 
... 
 

 
Subscription: { 
 
testRunChanged(_, { testRunId }) { 
 

 
// need to fetch the test run from database again 
 
    return TestRunDbService.getTestRunWith(testRunId); 
 
    }, 
 
}, 
 

 
...

Répondre

0

L'objet utilisé dans la méthode publish que la charge utile est alors paramètre root de votre méthode abonnement resolver - dans ce cas cela est _ dans votre fonction de résolution testRunChanged. Vous devriez simplement faire return _.