2016-10-26 2 views
3

Новое для Apollo, поэтому я решил взять most simple example I found и попробовать немного поработать с ним. Мой код может быть found here.Apollo Subscription, похоже, не вызвали на мутацию

Проблема, с которой я сталкиваюсь, заключается в том, что подписка не появляется, когда я вызываю мутацию createTask(). Мутация и подписки определяются в schema.graphql как:

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

type Subscription { 
    taskCreated: Task 
} 

И resolvers.js как:

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; 
    }, 
}, 

Что я ожидаю случиться, что я хотел бы получить console.log в сервер каждый раз, когда я запускаю в клиенте следующее:

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

Но ничего не происходит. Что мне не хватает?

+0

Случаются, чтобы выяснить, что этот вопрос? – Justin

+0

Хотел бы я. Не успел и расследовать это. – CodeChimp

+0

Имея ту же проблему: c – kayla

ответ

0

Функция распознавания подписки вызывается, когда есть фактически подписка на подписку GraphQL.

Поскольку вы не добавили клиента, который использует subscriptions-transport-ws, а SubscriptionClient для подписки на ваш веб-сайт и подписку, он не будет работать.

Что вы можете сделать, это добавить канал подписки на setupFunctions из SubscriptionManager, и в этом случае вы получите значение, которое выполняет функция pubsub.publish.

может выглядеть следующим образом:

... 
 

 
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: '/', 
 
}); 
 

 
...