Создать приложение реакции и подписку graphql - почему я получаю сообщение об ошибке при перезагрузке в реальном времени? - PullRequest
0 голосов
/ 08 июля 2019

Я использую Apollo Server и Apollo Client.

Все отлично работает. Я настроил базовую подписку на сервер, которая работает как положено. Но когда я сохраняю файл на клиенте и перезагружаем сервер в режиме реального времени, он не подключается к ws (ошибка: соединение отклонено), а также обычное соединение http не подключается. Также (ошибка: соединение отказано)

После того, как я обновлю страницу вручную с помощью F5, она подключится.

В чем здесь проблема? (reconnect: true is set) на соединении ws.

Вот как я инициализирую клиент Apollo:

const wsLink = new WebSocketLink({
  uri: `ws://localhost:4000/graphql`,
  options: {
    reconnect: true,
    reconnectionAttempts: 10000
  }
});

// Create an http link:
const httpLink = new HttpLink({
  uri: "http://localhost:4000/graphql"
});

const link = split(
  // split based on operation type
  ({ query }) => {
    const definition = getMainDefinition(query);
    return (
      definition.kind === "OperationDefinition" &&
      definition.operation === "subscription"
    );
  },
  wsLink,
  httpLink
);

const client = new ApolloClient({
  link,
  cache: new InMemoryCache()
});

const rootEl = document.getElementById("root");

ReactDOM.render(
  <ApolloProvider client={client}>
    <App />
  </ApolloProvider>,
  rootEl
);

И вот как я инициализирую на стороне сервера:

const PORT = 4000;

const app = express();

app.use(
  session({
    secret: "testsecret",
    resave: false,
    saveUninitialized: false
  })
);

app.use(cors({ credentials: true }));

app.use(passport.initialize());
app.use(passport.session());

const server = new ApolloServer({
  typeDefs,
  resolvers,
  context: ({ req, res, connection }) => {
    if (connection) {
      return connection.context;
    } else {
      return buildContext({ User, Chat, req, res });
    }
  },
  playground: {
    settings: {
      "request.credentials": "include"
    }
  }
});

server.applyMiddleware({ app, cors: true });

const httpServer = http.createServer(app);
server.installSubscriptionHandlers(httpServer);

httpServer.listen({ port: PORT }, () => {
  console.log(
    `Server is running on http://localhost:${PORT}${server.graphqlPath}`
  );
  console.log(`ws://localhost:${PORT}${server.subscriptionsPath}`);
});

Вот полный проект: https://github.com/SelfDevTV/graphql-simple-chat

...