3

Apollo 的新手,所以我决定采用我发现的最简单的例子,并尝试以稍微不同的方式来工作。我的代码可以在这里找到

我遇到的问题是,当我调用 Mutation 时,似乎没有调用 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
  }
}

但什么也没有发生。我错过了什么?

4

1 回答 1

0

当实际订阅了 GraphQL 订阅时,将调用订阅解析器函数。

由于您没有添加使用subscriptions-transport-wsSubscriptionClient订阅您的 websocket 的客户端,因此订阅将不起作用。

您可以做的是将订阅频道添加到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: '/',
});

...

于 2017-03-21T10:08:04.453 回答