GraphQL Secure Web Socket с Express - PullRequest
       7

GraphQL Secure Web Socket с Express

0 голосов
/ 09 апреля 2020

Я создаю Express, Nuxt (SPA, в основном Vue), сайт GraphQL с подписками graphql. Мои веб-сокеты поддерживаются только через http, что очень печально. Не могу понять, как использовать wss: // mydomain / graphql / subscription. Когда я пытаюсь сгенерировать свои .crt и .key и запустить его на localhost: 3000, я получаю эту ошибку: ERR_SSL_VERSION_OR_CIPHER_MISMATCH. Я не уверен, что сертификаты openssl верны, но я пробовал как 10 руководств, и ни один из них не работал для меня.

Кроме того, я развертываю эту сеть в Heroku, если это что-то меняет. (когда я отправляю sh heroku с этим конфигом «https», сайт даже не загружается).

Еще одна вещь: я использую graphql-compose-mongose ​​для генерации моей схемы, таким образом используя Apollo невозможно (я думаю), потому что для этого требуются TypeDef и Resolvers.

Вот мой код. Для сокета на клиенте я использую "graphql-subscription-client".

const consola = require("consola");
const {Nuxt, Builder} = require("nuxt");
const cors = require("cors");
const {SubscriptionServer} = require("subscriptions-transport-ws");
const {execute, subscribe} = require("graphql");
// const {createServer} = require("http");
const {createServer} = require("https");
const {graphiqlExpress, graphqlExpress} = require("graphql-server-express");
const bodyParser = require("body-parser");


const fs = require("fs");
const path = require("path");

const server = express();

// Import and Set Nuxt.js options
const config = require('../nuxt.config.js');
config.dev = process.env.NODE_ENV !== 'production';

// GraphQL schema
const schema = require("./graphql/schema");

async function start() {
  // Init Nuxt.js
  const nuxt = new Nuxt(config);

  const {host, port} = nuxt.options.server;

  // accept clients
  server.use('*', cors({origin: `https://${host}:${port}`}));

  // setup graphql server
  server.use('/graphql', bodyParser.json(), graphqlExpress({schema}));
  server.use('/graphiql', graphiqlExpress({
    endpointURL: '/graphql',
    subscriptionsEndpoint: `wss://${host}:${port}/subscriptions`
  }));

  // database connection
  await require("./database/connection");

  // generate GraphQL schema
  await require("../scripts/buildSchema");

  await nuxt.ready();
  // Build only in dev mode
  if (config.dev) {
    const builder = new Builder(nuxt);
    await builder.build()
  }

  // Give nuxt middleware to express
  server.use(nuxt.render);

  // wrap express server in web socket
  const serverOptions = {
    cert: fs.readFileSync(path.resolve(__dirname, './mydomain.crt')),
    key: fs.readFileSync(path.resolve(__dirname, './mydomain.key'))
  };


  // const webSocket = createServer(server);
  const webSocket = createServer(server, serverOptions);

  // start server
  webSocket.listen(port, () => {
    consola.ready({
      message: `Server listening on https://${host}:${port}`,
      badge: true
    });

    // Set up the WebSocket for handling GraphQL subscriptions
    new SubscriptionServer({
      execute,
      subscribe,
      schema
    }, {
      server: webSocket,
      path: '/subscriptions',
    });
  });
}

start();

Спасибо за ваши ответы.

1 Ответ

0 голосов
/ 10 апреля 2020

Оказывается, Heroku не предоставляет бесплатный SSL. Это стоит 20 $ / месяц. Так что это нельзя сделать бесплатно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...