GraphQL Secure Web Socket With Express



我正在创建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和Resolver。

这是我的密码。对于客户端上的套接字,我使用"graphql订阅客户端"。

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();

谢谢你的回答。

原来Heroku不提供免费的SSL。每月20美元。所以这不是免费的。

最新更新