Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GraphQL schema won't import

I'm trying setup an express GraphQL server. Following a tutorial when I put the following in the server startup like this:

//   ENTIRE SCHEMA IN MAIN FILE  THIS WORKS!!!

...
var graphql = require('graphql');

const RootQuery = new graphql.GraphQLObjectType({
  name: 'RootQuery',
  description: 'The root query',
  fields: {
    viewer: {
      type: graphql.GraphQLString,
      resolve() {
        return 'viewer!';
      }
    }
  }
});

const Schema = new graphql.GraphQLSchema({
  query: RootQuery
});

app.use('/graphql', graphqlHTTP({ schema: Schema }));
...

it works, returning the data 'viewer! But as I don't want everything in the main file, I tried to transfer this exact code to another file and import it like this:

//THIS DOES NOT WORK
...
var Schema = require('./build/models/graphql/schema');
  app.use('/graphql', graphqlHTTP({ schema: Schema }));
...

I get the following error:

{
  "errors": [
    {
      "message": "Schema must be an instance of GraphQLSchema. Also ensure that there are not multiple versions of GraphQL installed in your node_modules directory."
    }
  ]
}

I'm not sure what I'm doing wrong. In case this has anything to do with it, I am writing in es6 then transpiling back to 5 in a build script. Here's the build of the schema file:

// TRANSPILED SCHEMA

'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var graphql = require('graphql');

var RootQuery = new graphql.GraphQLObjectType({
  name: 'RootQuery',
  description: 'The root query',
  fields: {
    viewer: {
      type: graphql.GraphQLString,
      resolve: function resolve() {
        return 'viewer!';
      }
    }
  }
});

var Schema = new graphql.GraphQLSchema({
  query: RootQuery
});

exports.default = Schema;

And here is my package.json:

    "express": "^4.13.4",
    "express-graphql": "^0.5.3",
    "graphql": "^0.6.0",

I've checked that only one graphql is in the node_modules folder. Does graphql expect the same INSTANCE across all modules, like a shared global instance? Does express-graphql use it's own version? How do I check? I'm new to node, is there a way to check the instances?

like image 790
Coco Avatar asked Oct 30 '22 00:10

Coco


1 Answers

I don't think this is a GraphQL problem, but a problem with how you're using require and exports in JS. The problem is probably:

var Schema = require('./build/models/graphql/schema')

along with

var Schema = new graphql.GraphQLSchema({ query: RootQuery });

exports.default = Schema;

You're not importing the same value that you're exporting. Try either exporting Schema as module.exports = Schema or importing it as Schema = require("./...").default

like image 105
Lee Byron Avatar answered Dec 03 '22 17:12

Lee Byron