【问题标题】:GraphQL Secure Web Socket With Express使用 Express 的 GraphQL 安全 Web 套接字
【发布时间】:2020-07-22 13:59:48
【问题描述】:

我正在创建 Express、Nuxt(SPA,基本上是 Vue)、带有 graphql 订阅的 GraphQL 网站。我的网络套接字仅通过 http 支持,这是非常不幸的。我不知道如何使用 wss://mydomain/graphql/subscriptions。当我尝试生成我的 .crt 和 .key 并在 localhost:3000 上运行它时,我收到此错误: ERR_SSL_VERSION_OR_CIPHER_MISMATCH 。我不确定 openssl 证书是否正确,但我尝试了 10 个指南,但它们都不适合我。

另外,我正在将此网络部署到 Heroku,如果这有什么不同的话。 (当我使用这个“https”配置推送到 heroku 时,网站甚至没有加载)。

还有一件事:我正在使用 graphql-compose-mongose 来生成我的架构,因此使用 Apollo 是不可能的(我认为),因为它需要 TypeDef 和解析器。

这是我的代码。 对于客户端上的套接字,我使用“graphql-subscriptions-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();

感谢您的回答。

【问题讨论】:

    标签: express https websocket openssl graphql


    【解决方案1】:

    原来 Heroku 不提供免费的 SSL。它的费用为 20 美元/月。所以这不能免费完成。

    【讨论】:

      猜你喜欢
      • 2019-01-13
      • 2023-03-06
      • 2021-09-21
      • 2018-12-02
      • 2021-07-04
      • 2021-06-26
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      相关资源
      最近更新 更多