2017-10-17 75 views
0

我對graphql非常新,我正在玩一個簡單的案例,不能使它的工作,案件是一對多,用戶有很多音符,一個音符屬於用戶。 我的問題是與「NoteType」我不能返回「用戶類型」,我可以返回創建的注意,但不是用戶類型錯誤:Note.user字段類型必須是輸出類型,但得到:[對象對象]

代碼的用戶的用戶名(重要刪除某些字段)

NoteType

當我取消去用戶我有錯誤錯誤:Note.user字段類型必須是輸出類型,但得到:[對象OBJE克拉。

import { 
    GraphQLObjectType, 
    GraphQLInt, 
    GraphQLString, 
    GraphQLBoolean, 
} from 'graphql'; 

import UserType from '../User/UserType'; 
import User from '../User/User'; 

const NoteType = new GraphQLObjectType({ 
    name: 'Note', 
    description: 'This represents a Note', 
    fields:() => ({ 
    id: { 
     type: GraphQLInt, 
     resolve: (note) => note.id, 
    }, 
    userId: { 
     type: GraphQLInt, 
     resolve: (note) => note.userId, 
    }, 
    title: { 
     type: GraphQLString, 
     resolve: (note) => note.note, 
    }, 
    username: { 
     type: GraphQLString, 
     resolve: (note) => (
     User 
      .findOne({ 
      where: { 
       id: note.userId, 
      }, 
      }).then(user => user.username) 
    ), 
    }, 
    /* user: { ***PROBLEM HERE!!*** 
     type: UserType, 
     resolve: (note) => (
     User 
      .findOne({ 
      where: { 
       id: note.userId, 
      }, 
      }).then(user => user) 
    ), 
    },*/ 
    }), 
}); 

module.exports = NoteType; 

的UserType

import { 
    GraphQLObjectType, 
    GraphQLInt, 
    GraphQLString, 
    GraphQLList, 
} from 'graphql'; 

import NoteType from '../Note/NoteType'; 
import Note from '../Note/Note'; 

import LocationType from '../Location/LocationType'; 
import Location from '../Location/Location'; 

const UserType = new GraphQLObjectType({ 
    name: 'User', 
    description: 'This represents a User', 
    fields:() => ({ 
    id: { 
     type: GraphQLInt, 
     resolve: (user) => user.id, 
    }, 
    username: { 
     type: GraphQLString, 
     resolve: (user) => user.username, 
    }, 
    email: { 
     type: GraphQLString, 
     resolve: (user) => user.email, 
    }, 
    notes: { 
     type: new GraphQLList(NoteType), 
     resolve: (user) => (
     Note 
      .findAll({ 
      where: { 
       userId: user.id, 
      }, 
      }) 
    ), 
    }, 
    }), 
}); 

module.exports = UserType; 

NoteQuery

import { 
    GraphQLInt, 
    GraphQLString, 
    GraphQLList, 
} from 'graphql'; 

import NoteType from '../../models/Note/NoteType'; 
import Note from '../../models/Note/Note'; 

import UserType from '../../models/User/UserType'; 
import User from '../../models/User/User'; 

const noteQuery = { 
    type: new GraphQLList(NoteType), 
    args: { 
    id: { 
     name: 'id', 
     type: GraphQLInt, 
    }, 
    userId: { 
     name: 'userId', 
     type: GraphQLInt, 
    }, 
    user: { 
     name: 'user', 
     type: GraphQLString, 
    }, 
    note: { 
     name: 'note', 
     type: GraphQLString, 
    }, 
    createdAt: { 
     name: 'createdAt', 
     type: GraphQLString, 
    }, 
    updatedAt: { 
     name: 'updatedAt', 
     type: GraphQLString, 
    }, 
    }, 
    resolve: (user, args) => Note.findAll({ where: args }), 
}; 

module.exports = noteQuery; 

UserQuery

import { 
    GraphQLInt, 
    GraphQLString, 
    GraphQLList, 
} from 'graphql'; 

import UserType from '../../models/User/UserType'; 
import User from '../../models/User/User'; 

const userQuery = { 
    users: { 
    type: new GraphQLList(UserType), 
    args: { 
     id: { 
     name: 'id', 
     type: GraphQLInt, 
     }, 
     username: { 
     name: 'username', 
     type: GraphQLString, 
     }, 
     email: { 
     name: 'email', 
     type: GraphQLString, 
     }, 
     createdAt: { 
     name: 'createdAt', 
     type: GraphQLString, 
     }, 
     updatedAt: { 
     name: 'updatedAt', 
     type: GraphQLString, 
     }, 
    }, 
    resolve: (user, args) => User.findAll({ where: args }), 
    }, 
    user: { 
    type: UserType, 
    args: { 
     id: { 
     name: 'id', 
     type: GraphQLInt, 
     }, 
     username: { 
     name: 'username', 
     type: GraphQLString, 
     }, 
     email: { 
     name: 'email', 
     type: GraphQLString, 
     }, 
     createdAt: { 
     name: 'createdAt', 
     type: GraphQLString, 
     }, 
     updatedAt: { 
     name: 'updatedAt', 
     type: GraphQLString, 
     }, 
    }, 
    resolve: (user, args) => User.findOne({ where: args }), 
    }, 
}; 

module.exports = userQuery; 

任何幫助或提示,提前致謝!

回答

1

看起來像循環依賴性問題。您將用戶模塊導入Note模塊,同時將Note模塊導入您的用戶模塊。 user字段的解析器正在查找GraphQLObjectType的實例,但它只接收導出類型的未完成副本。

您可以查看this question以獲得更全面的解釋和一些解決方法。

但是,我建議只需使用buildSchema並使用解析器通過根對象傳遞字符串文本來聲明模式。或者使用graphql-toolmakeExecutableSchema,這更容易。無論哪種方式,您都可以節省處理循環依賴的頭痛問題,並使您的模式更具可讀性。

+0

謝謝,我會調查,謝謝你的提示! – Julieta

相關問題