Я создаю 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();
Спасибо за ваши ответы.