Search code examples
node.jsgraphqlapollo-serverhapi

server.register() function throwing "register is missing", even though i have properly registered the plugins for graphql


I have created a node js project with graph ql (with a very basic schema) but when i am trying to start the server after registering the plugins for graphql and graphiql, i am getting the register is missing error. Below is my code

const hapi=require('hapi');
const { graphqlHapi, graphiqlHapi } = require('apollo-server-hapi');
const { makeExecutableSchema } = require('graphql-tools');

const graphqlSchema = require('./graphql/schema');
const createResolvers = require('./graphql/resolvers');

const executableSchema = makeExecutableSchema({
    typeDefs: [graphqlSchema],
    resolvers: createResolvers(),
});

const server=hapi.server({
    port: 4000,
    host:'localhost'
});

server.register({
    plugin: graphqlHapi,
    options: {
      path: '/graphql',
      graphqlOptions: () => ({
        pretty: true,
        schema: executableSchema,
      }),
    },
});  

server.register({

    plugin: graphiqlHapi,
    options: {
      path: '/graphiql',
      graphiqlOptions: {
        endpointURL: '/graphql',
      },
    },
});

const init= async()=>{
    routes(server);
    await server.start();
    console.log(`Server is running at: ${server.info.uri}`);
}
init();

I had initially given the key name as register instead of plugin in the server.register() functions. In either case, i am getting the below error

(node:19104) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.

(node:19104) UnhandledPromiseRejectionWarning: AssertionError [ERR_ASSERTION]: I nvalid plugin options {

"plugin": { "options": { "path": "/graphql", "graphqlOptions": () => ({\r\n pretty: true,\r\n schema: exe cutableSchema,\r\n }) }, "register" [1]: -- missing -- } }

Please help me out in understanding whenter code herey this happening and how it can be rectified.

Below is the dependencies in my project

apollo-server-hapi": "^2.3.1", "graphql": "^14.0.2", "graphql-tools": "^4.0.3", "hapi": "^17.8.1",

EDIT Code after making the suggested changes

const hapi=require('hapi');
const { graphqlHapi, graphiqlHapi } = require('apollo-server-hapi');
const { makeExecutableSchema } = require('graphql-tools');
const graphqlSchema = require('./graphql/schema');
const createResolvers = require('./graphql/resolvers');
const executableSchema = makeExecutableSchema({
    typeDefs: [graphqlSchema],
    resolvers: createResolvers(),
  });
async function start_server() {

    const server=hapi.server({
        port: 4000,
        host:'localhost'
    });

    await server.register({
        plugin: graphqlHapi,
        options: {
        path: '/graphql',
        graphqlOptions: () => ({
            pretty: true,
            schema: executableSchema,
        }),
        route: {
            cors: true,
        },
        },

    });

    await server.register({

        plugin: graphiqlHapi,
        options: {
        path: '/graphiql',
        graphiqlOptions: {
            endpointURL: '/graphql',
        },
        route: {
            cors: true,
        },
        },

    });

    try {    
        await server.start();
        console.log(`Server is running at: ${server.info.uri}`);
    } catch (err) {
        console.log(`Error while starting server: ${err.message}`)
    }
}


start_server();

Solution

  • There is no need to register the plugins in the latest release of apollo-server-hapi. It contains GraphQL playground instead of graphiql.

    The below changes need to be done instead of registering.

    const {ApolloServer} = require('apollo-server-hapi');
    const executableSchema = makeExecutableSchema({
        typeDefs: [graphqlSchema],
        resolvers: createResolvers(),
      });
    
    
    const server = new ApolloServer({
        schema:executableSchema
      });
    
    async function start_server() {
    
        const app=hapi.server({
            port: 4000,
            host:'localhost'
        });
        await server.applyMiddleware({ app });
        try {    
            await app.start();
            console.log(`Server is running at: ${app.info.uri}`);
        } catch (err) {
            console.log(`Error while starting server: ${err.message}`)
        }
    }
    
    
    start_server();