Сервер Apollo — соединение с веб-сокетом подписки GraphQL не сохраняется

Я работал с подписками на graphql и смог это реализовать. Он отлично работает без каких-либо проблем, когда я размещаю то же самое на локальном компьютере. Но когда я развертываю его на сервере с параметром idle_timeout, установленным на «x» секунд, он разрывает соединение с клиентом на игровой площадке graphql после этих «x» секунд. Я ожидаю, что это сохранится...

Вот мой код

const http = require('http');
const {ApolloServer, gql} = require('apollo-server-express');
const express = require('express');
const db = require('./db');
const { PubSub, withFilter } = require('graphql-subscriptions')
const env = require('./config');
const cors = require('cors');


const pubSub = new PubSub();
const app = express();
app.use(cors());

const typeDefs = gql`
    type Query {
        qflEventTypes: [String]
    }

    type Mutation {
        pushQflData(symbol: String, date: Int, field: String, value: String, type: String) : Boolean
        pushQflDBEvent(event : String, date : Int, factor : String) : Boolean
    }

    type Subscription {
        qflDataChange: qflData
        qflEventChange(eventname : String): qflEvent
    }

    type qflData {
        symbol : String
        date : Int
        field : String
        value : String
        type : String
    }

    type qflEvent {
        event : String
        date : Int
        factor : String
    }
`;

const resolvers = {
    Query: {
        qflEventTypes(){
            return db.qflevents.list().map(a => a.eventname);
        }
    },
    Mutation: {
        pushQflData : (root,{symbol,date,field,value,type}) => {
            pubSub.publish('QFL_DATA_CHANGED', {qflDataChange: {symbol,date,field,value,type}}) 
            return true;
        },
        pushQflDBEvent : (root,{event,date,factor}) => {
            pubSub.publish('QFL_EVENT_CHANGED', {qflEventChange: {event,date,factor}}) 
            return true;
        }
    },
    Subscription: {
        qflDataChange :{
            subscribe: () => pubSub.asyncIterator('QFL_DATA_CHANGED')
        },
        qflEventChange : {
            subscribe: withFilter(() => pubSub.asyncIterator('QFL_EVENT_CHANGED'), (payload, variables) => {
                return payload.qflEventChange.event === variables.eventname;
        })
        }
    }
};


const server = new ApolloServer({
    typeDefs,
    resolvers,
    introspection: true, // enables introspection of the schema
    playground: true, // enables the actual playground
    subscriptions: {
      path: '/api/ws',
      keepAlive: 15000,
      onConnect: () => console.log("connected"),
      onDisconnect: () => console.log("disconnected")
    }
});

server.applyMiddleware({app,path: '/api/ql', cors: false});

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

var port = env.Runtime.PORT || 9000

httpServer.listen(port, () => {
    console.log(`???? Server ready at http://localhost:${port}${server.graphqlPath}`)
    console.log(`???? Subscriptions ready at ws://localhost:${port}${server.subscriptionsPath}`)
  })


Я уже потратил пару дней на то же самое. Если кто-нибудь может помочь мне или дать мне руководство, это будет полезно.


person Sameer Sawla    schedule 26.03.2020    source источник
comment
keepAlive - это параметр для setInterval - масштабируется в миллисекундах .... 1000 просто слишком мало ;)   -  person xadm    schedule 27.03.2020
comment
На самом деле я пробовал и более длинные интервалы 15000 20000, все та же проблема   -  person Sameer Sawla    schedule 27.03.2020
comment
все еще не слишком много... stackoverflow.com/q/26971026/6124657   -  person xadm    schedule 27.03.2020
comment
Почему слишком низкий интервал может быть проблемой, если это интервал проверки активности? В этом нет никакого смысла.   -  person Der Hochstapler    schedule 30.06.2021