GraphQL / Relay Schema“无法查询字段...”

时间:2015-11-30 08:10:25

标签: javascript relayjs graphql graphql-js

我在查询graphql / relay中的某些字段时遇到问题。 我正在尝试查询下面架构中课程的“courseName”字段。

如果我查询用户,例如:

  

{user(id:1){firstname,lastname}}

它起作用并返回正确的响应。

这是我的架构:

import {
  GraphQLBoolean,
  GraphQLFloat,
  GraphQLID,
  GraphQLInt,
  GraphQLList,
  GraphQLNonNull,
  GraphQLObjectType,
  GraphQLSchema,
  GraphQLString,
} from 'graphql';

import {
  connectionArgs,
  connectionDefinitions,
  connectionFromArray,
  fromGlobalId,
  globalIdField,
  mutationWithClientMutationId,
  nodeDefinitions,
} from 'graphql-relay';

import {
  // Import methods that your schema can use to interact with your database
  User,
  Course,
  getUser,
  getCourses
} from './database';

/**
 * We get the node interface and field from the Relay library.
 *
 * The first method defines the way we resolve an ID to its object.
 * The second defines the way we resolve an object to its GraphQL type.
 */
var {nodeInterface, nodeField} = nodeDefinitions(
  (globalId) => {
    var {type, id} = fromGlobalId(globalId);
    if (type === 'User') {
      return getUser(id);
   } else if (type === 'Course') {
      return getCourses(id);
    } else {
      return null;
    }
  },
  (obj) => {
    if (obj instanceof User) {
      return userType;
   } else if (obj instanceof Course)  {
      return courseType;
    } else {
      return null;
    }
  }
);

/**
 * Define your own types here
 */

var userType = new GraphQLObjectType({
  name: 'User',
  description: 'A person who uses our app',
  fields: () => ({
    id: globalIdField('User'),
    firstname : {
      type : GraphQLString,
      description : 'User First Name'
    },
    lastname :{
      type : GraphQLString,
      description : 'User Last Name'
    },
    email : {
      type : GraphQLString,
      description : 'User email'
    },
    company : {
      type : GraphQLString,
      description : 'User company'
    },
    courses: {
      type: courseConnection,
      description: 'A user\'s collection of courses',
      // args: {
      //   userId: {
      //     type: GraphQLInt
      //   }
      // },
      // resolve: (user, args) => connectionFromArray(getCourses(args.userId), args),
      args: connectionArgs,
      resolve: (user, args) => connectionFromArray(
        getCourses(user.id),
        args
      )
    },
  }),
  interfaces: [nodeInterface],
});

var courseType = new GraphQLObjectType({
  name: 'Course',
  description: 'A shiny course',
  fields: () => ({
    id: globalIdField('Course'),
    courseName: {
      type: GraphQLString,
      description: 'The name of the Course',
    }
  }),
  interfaces: [nodeInterface],
});

/**
 * Define your own connection types here
 */
var {connectionType: courseConnection} =
  connectionDefinitions({name: 'Course', nodeType: courseType});

/**
 * This is the type that will be the root of our query,
 * and the entry point into our schema.
 */
var queryType = new GraphQLObjectType({
  name: 'Query',
  fields: () => ({
    node: nodeField,
    // Add your own root fields here
    user: {
      type: userType,
      args: {
          id: { type: GraphQLInt }
      },
      resolve: (_,{id}) => getUser(id)
    }
  })
});

/**
 * This is the type that will be the root of our mutations,
 * and the entry point into performing writes in our schema.
 */
var mutationType = new GraphQLObjectType({
  name: 'Mutation',
  fields: () => ({
    // Add your own mutations here
  })
});

/**
 * Finally, we construct our schema (whose starting query type is the query
 * type we defined above) and export it.
 */
export var Schema = new GraphQLSchema({
  query: queryType,
  // Uncomment the following after adding some mutation fields:
  // mutation: mutationType
});

这是我的database.js:

import Course from './models/course';
import User from './models/user';

module.exports = {

   User : User,
  // Export methods that your schema can use to interact with your database
  getUser: (id) => {
     return User.findOne( {_id: id}).exec();
  },
  getCourses: (userId) => {
     return Course.find( { userId : userId }).exec();
  },
  Course : Course
  // getCourse: (id) => widgets.find(w => w.id === id),
  // User,
  // Widget,
};

当我尝试查询:

  

{user(id:1){courses {courseName}}}

它给了我错误:

  

“无法在'CourseConnection'中查询字段'courseName'”

这似乎是连接的问题。 此外,我正在使用cURL测试此查询。因为我想在移动到react / relay之前测试模式。

我错过了什么? 谢谢。

1 个答案:

答案 0 :(得分:4)

所以,我发现了为什么这不起作用。 我不得不以RelayJS风格进行查询:

这样:

{ user(id:1){courses(first:2){edges{node{courseName}}}} }