2017-02-22 96 views
0

看來我沒有得到一些基本的東西與graphql。graphql拋出未知的參數錯誤

我想通過它的id得到一個用戶,而這又是另一個查詢的結果。在這種情況下,查詢某些會話數據。

我不明白爲什麼發生錯誤。

這裏是我的代碼:

{ 
    session(key: "558fd6c627267d737d11e758f1ae48cae71fc9b584e2882926ad5470c88d7c3ace08c9c7") { 
     userId 
     expires 
     user(id: userId) { 
      name 
     } 
    } 
} 

我也得到

對類型的字段 「用戶」, 「會議」 未知參數 「ID」

我的模式是這樣的:

type Session { 
    userId: String, 
    expires: String, 
    user: User 
} 

type User { 
    _id: String 
    name: String 
    email: String 
    firstName: String 
    lastName: String 
} 

type Query { 
    session(key: String!): Session 
    user(id: String!): User 
} 

附錄Feb 23 2017

我很抱歉,在我的初始文章中,我對相應的解析器沒有足夠的瞭解。是的,我的解決方案是定義和e。 G。如果我不添加用戶,該查詢適用於會話。

這裏是我的根:

{ 
    Query: { 
     async user(parentValue, args, req) { 
      let user = await adapters.users.byId(args.id); 
      return user; 
     }, 
     async session(parentValue, args, req) { 
      let session = await adapters.session(args.key); 
      let userId = session.session.userId; 
      let expires = session.expires; 
      return {userId: userId, expires: expires}; 
     } 
    } 

} 

回答

0

您需要創建Session式現場user一些resolver功能,因爲GraphQL不知道如何返回user。在graphql-js它看起來像

const Session = new GraphQLObjectType({ 
    name: 'Session', 
    fields: { 
     userId: { type: GraphQLString }, 
     expires: { type: GraphQLString }, 
     user: { 
      type: User, // it is your GraphQL type 
      resolve: function(obj, args, context){ 
       // obj is the session object returned by ID specified in the query 
       // it contains attributes userId and expires 
       // however graphql does not know you want to use the userId in order to retrieve user of this session 
       // that is why you need to specify the value for field user in type Session 
       return db.User.findById(obj.userId).then(function(user){ 
        return user; 
       }); 
      } 
     } 
    } 
}); 

距離Node.js的只是一個簡單的例子來告訴你如何可能會返回user實例。您可以指定如何檢索每個GraphQL類型中的每個字段的值(每個字段可以具有它自己的resolve函數)。

我建議你閱讀有關root and resolvers

編輯

我會告訴你一個例子,你如何處理這樣的情況GraphQL文檔。讓我們考慮兩種類型:UserSession

type User { 
    _id: String 
    name: String 
} 

type Session { 
    expires: String 
    user: User 
} 

如果你希望你的查詢返回Session對象連同它的User,你並不需要在Session類型的userId領域。 您可以通過兩種方式解決這種情況。首先是爲session查詢使用單個解析器。

{ 
    Query: { 
     async session(parentValue, args, req) { 
      let session = await adapters.session(args.key); 
      // now you have your session object with expires and userId attributes 
      // in order to return session with user from query, you can simply retrieve user with userId 
      let user = await adapter.users.byId(session.userId); 
      return { expires: session.expires, user: user } 
     } 
    } 
} 

這是您的第一個選項。使用該解決方案,您可以返回session對象,其中user通過單個查詢分配給它,並且在Session類型的任何字段上沒有額外的resolve方法。第二種解決方案是一個我先前的研究顯示,當您使用Session類型的字段userresolve方法 - 所以你只要告訴GraphQL應該如何獲取此字段的值。

+0

好了,我的錯,我想這不用說,還有每個查詢解析器。如果我沒有解析器,程序甚至會在這個錯誤消息之前崩潰。但爲了完整和明確,我會將解析器添加到上面的代碼中。 如果我只是查詢沒有用戶的會話,該查詢就可以工作。 一件事:我使用Apollo的graphql工具的架構定義,所以它的定義是基於GraphQL類型語言。看看2017年2月23日的附錄 – LongHike

+0

我編輯了答案,爲您的案例提供示例 – piotrbienias

+0

非常感謝。這工作! – LongHike

相關問題