apollo graphql network errors

Viewed 16

I have tried to resolve this network errors but it has no possible and I do not know what is causing this. This is my apollo server index:

const mongoose = require('mongoose')
const {ObjectId} = require('mongodb')
const { createServer } = require('http')
const { execute, subscribe } = require('graphql')
const { SubscriptionServer } = require('subscriptions-transport-ws')
const { makeExecutableSchema } = require ('@graphql-tools/schema')
const express = require('express')
const { ApolloServer } = require('apollo-server-express')
const {resolvers,typeDefs} = require('./graphql')
const jwt = require('jsonwebtoken')
const {onConnect,onDisconnect} = require('./controllers/User')
require('dotenv').config()
const graphqlUploadExpress = require('graphql-upload/graphqlUploadExpress.js')
const { EventEmitter } = require('events')
const { PubSub } =require('graphql-subscriptions')
const { RedisPubSub } =require('graphql-redis-subscriptions')
const Redis = require('ioredis')
const 
{
    ApolloServerPluginDrainHttpServer,
    ApolloServerPluginLandingPageGraphQLPlayground,
    ApolloServerPluginLandingPageLocalDefault
} = require('apollo-server-core')
const { WebSocketServer} = require('ws')
const {useServer } = require('graphql-ws/lib/use/ws')
const path = require('path')
const bodyParser = require('body-parser')

const biggerEventEmitter = new EventEmitter();
biggerEventEmitter.setMaxListeners(0);



const options = {
    host: process.env.REDIS_DOMAIN_NAME,
    port: process.env.PORT_NUMBER,
    password:process.env.REDIS_PASSWORD,
    retryStrategy: times => {
        // reconnect after
        return Math.min(times * 50, 2000);
      }
  };

  
  const pubsub = process.env.NODE_ENV === 'development' ? new PubSub({eventEmitter: biggerEventEmitter}) : new RedisPubSub({
  publisher: new Redis(options),
  subscriber: new Redis(options)
});
mongoose.connect(process.env.BBDD,
{},(err,_)=>
{
    if(err)
    {
        console.log("Error de conexion")
    }
    else
    {
        console.log("Conexion Base de datos Correcta")
        server()
    }
})

async function server()
{
    const app = express()
    
    const httpServer = createServer(app)
    const schema = makeExecutableSchema({ typeDefs, resolvers })
    const PORT = process.env.APP_PORT

    const getDynamicContext = async (ctx, msg, args) => {
       if (ctx.connectionParams.authToken) {
          const user = jwt.verify(ctx.connectionParams.authToken.replace("Bearer ", ""),process.env.KEY);
          return { user, pubsub};
        }
        return { user: null };
      };
    const wsServer = new WebSocketServer(
        { 
            server: httpServer,
            path: '/graphql'
        })

    const serverCleanup = useServer({ 
        schema,
        context: (ctx, msg, args) => {
            return getDynamicContext(ctx, msg, args)
         },
        onConnect: async (ctx) => {
            console.log('onConnect');
            let connectionParams = ctx.connectionParams
            try
            {
                if (connectionParams.authToken) 
                {   
                    const user = jwt.verify(connectionParams.authToken.replace("Bearer ", ""),process.env.KEY)
                    await onConnect(user.id,pubsub)
                    return { user , pubsub}
                }
            }
            catch(error)
            {
                throw new Error('Missing auth token!')
            }
          },
        async onDisconnect(context)
        {
            console.log('onDisconnect');
            try
            {
                if(context.connectionParams&&context.connectionParams.authToken)
                {
                    const user = jwt.verify(context.connectionParams.authToken.replace("Bearer ", ""),process.env.KEY)
                    await onDisconnect(user.id,pubsub)  
                        
                }
            }
            catch(error)
            {
                /* throw new Error('Missing context!') */
            }
           
            
            
        }, }, wsServer)

    const server = new ApolloServer(
        {
            schema,
            persistedQueries:false,
            context: async ({ req ,connection }) => 
            {
                let authorization = req.headers.authorization
                try 
                {
                    if(authorization)
                    {   
                        user = jwt.verify(authorization.replace("Bearer ", ""),process.env.KEY) 
                        return{
                            user,
                            pubsub
                        }
                    }
                } 
                catch (error) 
                {
                    throw new Error("Token invalido");
                }

            },
            csrfPrevention: true,
            cache: 'bounded',
            plugins: [ApolloServerPluginDrainHttpServer({ httpServer }),
                ApolloServerPluginLandingPageLocalDefault({ embed: true }),
                {
                    async serverWillStart() {
                      return {
                        async drainServer() {
                          await serverCleanup.dispose();
                        },
                      };
                    },
                  }]
        })

        app.use(graphqlUploadExpress())
        await server.start()
    server.applyMiddleware({ app })

    httpServer.listen(process.env.PORT||4000, () => {
        console.log(
          `Server is now running on http://localhost:${process.env.PORT||4000}${server.graphqlPath}`,
        );
      });
    
} 

And this is my apollo client config:

import {ApolloClient,createHttpLink,defaultDataIdFromObject,InMemoryCache,split} from '@apollo/client'
import {WebSocketLink} from '@apollo/client/link/ws'
import { getMainDefinition } from '@apollo/client/utilities'
import { setContext } from "apollo-link-context"
import {createUploadLink} from 'apollo-upload-client'
import {getToken, getUpdatedTokenApi} from '../utils/auth'
import { GraphQLWsLink } from '@apollo/client/link/subscriptions';
import { createClient } from 'graphql-ws';
import { from, HttpLink } from '@apollo/client';
import { RetryLink } from '@apollo/client/link/retry';
import { disableFragmentWarnings } from 'graphql-tag';

disableFragmentWarnings()

const type = () =>
{
  if(window.location.pathname.startsWith(`/${process.env.ADMIN_DEV}`))
  {
    return 'admin'
  }
  else
  {
    return null
  }
}
const link = (e)=>
{
  switch (e) {
    case 1:
      return 'https://unglo.herokuapp.com/graphql'  
      case 2:
        return 'http://localhost:4000/graphql' 
    default:
      break;
  }
}
const ws_Link = (e)=>
{
  switch (e) {
    case 1:
      return 'wss://unglo.herokuapp.com/graphql'  
      case 2:
        return 'ws://localhost:4000/graphql' 
    default:
      break;
  }
}
import { onError } from "@apollo/client/link/error";

// Log any GraphQL errors or network error that occurred
const errorLink = onError(({ graphQLErrors, networkError }) => {
  if (graphQLErrors)
    graphQLErrors.forEach(({ message, locations, path }) =>
      console.log(
        `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`
      )
    );
  if (networkError) console.log(`[Network error]: ${networkError}`);
});

const token = getToken(type())
const updatedToken = getUpdatedTokenApi()

const httpLink = new createUploadLink({ 
  uri: link(2),
  headers: {
    'Apollo-Require-Preflight': 'true',
  },
  
});

const wsLink = new GraphQLWsLink(createClient(
  {
    url: ws_Link(2),
    connectionParams: 
      {
        authToken: token ? `Bearer ${token}` : updatedToken ? `Bearer ${updatedToken}` : "",
      },
      lazy:true,
      
  }
))
const splitLink = split(
  ({ query }) => {
    const definition = getMainDefinition(query);
    return (
      definition.kind === 'OperationDefinition' &&
      definition.operation === 'subscription'
    );
  },
  wsLink,
  httpLink,
  errorLink
);

const authMiddleware = setContext((_, { headers }) => 
{
  return {
    headers: 
    {
      ...headers,
      Authorization: token ? `Bearer ${token}` :updatedToken ? `Bearer ${updatedToken}` : "",
    },
  }
})

const client = new ApolloClient
({
    ssrMode: true,
    connectToDevTools:true,
    cache: new InMemoryCache({
    }),
    link:authMiddleware.concat(splitLink),
})

export default client

And these are errors: I have tried removing all apollo cliente queries and errors persists and google console dont show error details

Please if any body know about this kind of errors it shoud be helpfull

0 Answers
Related