J'essaye ma première approche GraphQL. Voici le code:
schema.js:
import {
GraphQLSchema,
GraphQLObjectType,
GraphQLInputObjectType,
GraphQLNonNull,
GraphQLString,
GraphQLBoolean,
GraphQLInt,
GraphQLID,
GraphQLList
} from 'graphql';
import Company from '../../models/Company';
const CompanyType = new GraphQLObjectType({
name: 'Company',
description: 'Company',
fields: {
_id: {
type: new GraphQLNonNull(GraphQLID)
},
name: {
type: GraphQLString
}
}
})
const Companies = {
type: CompanyType,
args: {
id: {
name: 'ID',
type: new GraphQLNonNull(GraphQLID)
}
},
resolve(root, params) {
return Company.find(params.id).exec();
}
}
export default new GraphQLSchema({
query: new GraphQLObjectType({
name: 'Query',
fields: Companies
})
});
Puis sur mon server.js :
import express from 'express';
import bodyParser from 'body-parser';
import mongoose from 'mongoose';
import morgan from 'morgan';
import graphqlHTTP from 'express-graphql';
import schema from './schema';
mongoose.Promise = global.Promise;
// set up example server
const app = express();
app.set('port', (process.env.API_PORT || 3001));
// logger
app.use(morgan('dev'));
// parse body
app.use(bodyParser.json());
// redirect all requests to /graphql
app.use(function redirect(req, res) {
res.redirect('/graphql');
});
app.use('/graphql', graphqlHTTP({
schema: schema,
graphqli: true,
pretty: true
}));
Je reçois l'erreur suivante:
D:\test\node_modules\graphql\jsutils\invariant.js:19
throw new Error(message);
^
Error: Query.type field type must be Output Type but got: undefined.
at invariant (D:\test\node_modules\graphql\jsutils\invariant.js:19:11)
at D:\test\node_modules\graphql\type\definition.js:361:29
at Array.forEach (native)
at defineFieldMap (D:\test\node_modules\graphql\type\definition.js:352:14)
at GraphQLObjectType.getFields (D:\test\node_modules\graphql\type\definition.js:306:44)
at typeMapReducer (D:\test\node_modules\graphql\type\schema.js:206:25)
at Array.reduce (native)
at new GraphQLSchema (D:\test\node_modules\graphql\type\schema.js:95:34)
at Object.<anonymous> (D:/9. DEV/WORKSPACE/mom/client/graphql/index.js:62:16)
at Module._compile (module.js:570:32)
at loader (D:\test\node_modules\babel-register\lib\node.js:144:5)
at Object.require.extensions.(anonymous function) [as .js] (D:\test\node_modules\babel-register\lib\node.js:154:7)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
Aide appréciée.
Dans votre définition de type de requête, vous avez écrit:
fields: Companies
CA devrait etre
fields: { Companies }
Si vous examinez les champs docs , un objet ou une fonction renvoie un objet, les clés de cet objet étant mappées sur les noms de tous les champs du type (dans ce cas, toutes les requêtes de votre schéma).
De plus, pour plus de clarté, étant donné que les requêtes et les mutations sont des champs de leurs types respectifs, il peut être préférable de les nommer dans camelCase plutôt que dans PascalCase (c'est-à-dire {companies: Companies}
dans votre fichier schema.js .__ lorsque vous créez un type d'objet pour String
fields: {
name: {type: String}
}
il en va de même pour vos champs personnalisés donc
fields: {Companies}