2

graphql/relay のいくつかのフィールドのクエリで問題が発生しています。以下のスキーマでコースの「courseName」フィールドを照会しようとしています。

たとえば、ユーザーにクエリを実行すると、次のようになります。

{ ユーザー(id:1){ファーストネーム,ラストネーム}}

それは機能し、正しい応答を返します。

ここに私のスキーマがあります:

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,
};

クエリを実行しようとすると:

{ ユーザー (id:1){コース{コース名}} }

エラーが表示されます:

「'CourseConnection' のフィールド 'courseName' をクエリできません」

接続に問題があるようです。また、このクエリを cURL でテストしています。反応/リレーに移行する前にスキーマをテストしたいので。

私は何が欠けていますか?ありがとうございました。

4

1 に答える 1