6

看来我的服务器是根据http://dev.apollodata.com/tools/apollo-server/setup.html上的 Apollo 文档设置的。在我的 server/main.js 文件中:

//SET UP APOLLO INCLUDING APOLLO PUBSUB
const executableSchema = makeExecutableSchema({
    typeDefs: Schema,
    resolvers: Resolvers,
    connectors: Connectors,
    logger: console,
});

const GRAPHQL_PORT = 8080;
const graphQLServer = express();

// `context` must be an object and can't be undefined when using connectors
graphQLServer.use('/graphql', bodyParser.json(), apolloExpress({
    schema: executableSchema,
    context: {}, //at least(!) an empty object
}));

graphQLServer.use('/graphiql', graphiqlExpress({
    endpointURL: '/graphql',
}));

graphQLServer.listen(GRAPHQL_PORT, () => console.log(
    `GraphQL Server is now running on http://localhost:${GRAPHQL_PORT}/graphql`
));
//SET UP APOLLO INCLUDING APOLLO PUBSUB

它在终端日志中打印出“GraphQL Server is now running on http://localhost:8080/graphql ”,表明服务器已成功初始化。

但是在我的 main_layout 组件的顶部,当我运行此代码时:

import { Client } from 'subscriptions-transport-ws';
const wsClient = new Client('ws://localhost:8080');

...我收到此控制台消息:

WebSocket 连接到“ws://localhost:8080/”失败:连接在收到握手响应之前关闭

我错过了什么?

4

4 回答 4

4

您需要创建一个专用的 websocket 服务器。它将在不同的端口上运行,并且设置它的代码在subscriptions-transport-ws包中提供。

查看 GitHunt-API 示例中的以下代码: https ://github.com/apollostack/GitHunt-API/blob/master/api/index.js#L101-L134

您还会看到此代码依赖于一个名为 SubscriptionManager 的类。它是 apollo 团队调用的包中的一个类graphql-subscriptions,您可以在此处找到如何使用它的示例: https ://github.com/apollostack/GitHunt-API/blob/master/api/subscriptions.js

于 2016-09-29T09:19:37.540 回答
3

TL;DR:您可以使用它graphql-up来快速获得具有订阅支持并准备就绪的 GraphQL 服务器。这是关于将其与 Apollo 和 websocket 客户端subscriptions-transport-ws结合使用的更详细的教程

一键获取GraphQL Server

假设您想在 IDL 语法中基于此 GraphQL Schema构建 Twitter 克隆:

type Tweet {
  id: ID!
  title: String!
  author: User! @relation(name: "Tweets")
}

type User {
  id: ID!
  name: String!
  tweets: [Tweet!]! @relation(name: "Tweets")
}

graphql-向上

单击此按钮以接收您自己的 GraphQL API,然后打开 Playground,您可以在其中添加一些推文、查询所有推文并测试订阅。

简单易用的 API

首先,让我们创建一个用户,它将成为所有即将发布的推文的作者。在 Playground 中运行这个突变:

mutation createUser {
  createUser(name: "Tweety") {
    id # copy this id for future mutations!
  }
}

以下是查询存储在 GraphQL 服务器上的所有推文及其作者的方法:

query allTweets {
  allTweets {
    id
    title
    createdAt
    author {
      id
      name
    }
  }
}

使用 websocket 的订阅支持

现在让我们订阅来自“Tweety”的新推文。这是语法:

subscription createdTweets {
  Message(filter: {
    mutation_in: [CREATED]
    node: {
      author: {
        name: "Tweety"
      }
    }
  }) {
    node {
      id
      text
      createdAt
      sentBy {
        id
        name
      }
    }
  }
}

现在在 Playground 中创建一个新选项卡并创建一条新推文:

mutation createTweet {
  createTweet(
    title: "#GraphQL Subscriptions are awesome!"
    authorId: "<id-from-above>"
  ) {
    id
  }
}

您应该会在之前订阅的其他选项卡中看到一个新事件弹出。

于 2017-03-29T12:19:37.240 回答
2

这是一个关于使用 Apollo GraphQL、React 和 Hapi 的演示:https ://github.com/evolastech/todo-react 。它不像 GitHunt-React 和 GitHunt-API 那样不堪重负

于 2016-12-15T05:52:28.170 回答
2

好像您实际上并没有制作 websocket 服务器。使用订阅服务器。请记住,正如 davidyaha 所说,您必须拥有一个专用的 websocket 端口(我也想过一次)绝对不是真的。我在同一个端口上有我的正常查询和潜艇。

import { createServer } from 'http';
import { SubscriptionServer } from 'subscriptions-transport-ws';
import { execute, subscribe } from 'graphql';
import { schema } from './my-schema';

// All your graphQLServer.use() etc setup goes here, MINUS the graphQLServer.listen(),
// you'll do that with websocketServer:

// Create WebSocket listener server
const websocketServer = createServer(graphQLServer);

// Bind it to port and start listening
websocketServer.listen(3000, () => console.log(
  `Server is now running on http://localhost:3000`
));

const subscriptionServer = SubscriptionServer.create(
  {
    schema,
    execute,
    subscribe,
  },
  {
    server: websocketServer,
    path: '/subscriptions',
  },
);
于 2017-11-14T02:24:02.973 回答