web-dev-qa-db-fra.com

Comment connecter GraphQL à MySQL

J'ai utilisé express cli pour mettre en place un projet express simple, et j'ai suivi des tutoriels pour créer le db.js et le schema.js, mais pour le moment, je ne vois pas comment déboguer cette erreur/pour afficher une partie du schéma dans la documentation graphiql

{
  "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."
    }
  ]
}

App.js

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var index = require('./routes/index');
var users = require('./routes/users');

var schema = require('./schema');
var graphqlHTTP = require('express-graphql');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', index);
app.use('/users', users);

app.use('/api', graphqlHTTP({schema, graphiql: true}));

// catch 404 and forward to error handler
app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

// error handler
app.use(function(err, req, res, next) {
    // set locals, only providing error in development
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development'
        ? err
        : {};

    // render the error page
    res.status(err.status || 500);
    res.render('error');
});

module.exports = app;

db.js

var Sequelize = require('sequelize');
var mysql = require('mysql');
var _ = require('lodash');

var Conn = new Sequelize('DB', 'Username', 'password', {
    Host: 'DB IP',
    dialect: 'mysql'
});

var Sectors = Conn.define('sectors', {
    name: {
        type: Sequelize.STRING,
        allowNull: false
    }
});

Sectors.sync({force: true}).then(function () {
  // Table created
  return Sectors.create({
    name: 'test'
  });
});

exports.default = Conn;

Schema.js

var {
    GraphQLSchema,
    GraphQLObjectType,
    GraphQLID,
    GraphQLString,
    GraphQLInt,
    GraphQLBoolean,
    GraphQLList,
    GraphQLNonNull
} = require('graphql');

var Db = require('./db');

var Sectors = new GraphQLObjectType({
  name: 'sectors',
  description: 'list of all the sectors',
  fields: () => {
    return {
      id: {
        type: GraphQLInt,
        resolve (sectors) {
          return sectors.id;
        }
      },
      name: {
        type: GraphQLString,
        resolve (sectors) {
          return sectors.name;
        }
      }
    };
  }
});

var Query = new GraphQLObjectType({
  name: 'Query',
  description: 'Root query object',
  fields: () => {
    return {
      sectors: {
        type: new GraphQLList(Sectors),
        args: {
          id: {
            type: GraphQLInt
          },
          name: {
            type: GraphQLString
          }
        },
        resolve (root, args) {
          return Db.models.sectors.findAll({ where: args });
        }
      }
    };
  }
});

var Schema = new GraphQLSchema({query: Query});
exports.default = Schema;
7
Ash

aha, la raison est que les exportations sont fausses

exports.default = Schema

comme ça

module.exports = Schema
5
ppy

Vous avez probablement pensé à export default Schema ou à quelque chose et fait une erreur, mais utilisez plutôt ceci module.exports = Schema. Exportations avec un "s", j’ai fait la même erreur en démarrant . Je conseillerais d’utiliser console.log () plus souvent pour déboguer vos fichiers js

2
Miss1900f5