2017-05-25 135 views
1

我對GraphQL非常新穎。我試圖傳遞一個像這樣的對象作爲參數:GraphQL--傳遞非特定對象的對象作爲參數

{ 
    filters: { 
    status: 'approved', 
    id: { 
     LESS_THAN: 200 
    } 
    } 
} 

或者這個對象可以是這樣的;

{ 
    filters: { 
    status: ['approved', 'pending'], 
    id: 200 
    } 
} 

我知道所有的屬性可以在這個對象,但所有這些屬性可以是一個字符串/ int或一個對象。

我試圖去定義它像這一點,但它顯然沒有奏效:

args: { 
    filters: { type: new GraphQLNonNull(new GraphQLNonNull(GraphQLString)) }, 
}, 

我試圖定義一個GraphQL型GraphQLInputObjectType的說法。

const OffersFiltersType = new GraphQLInputObjectType({ 
    name: 'Filters', 
    description: '...', 
    fields:() => ({}) 
    id: { 
     type: new GraphQLNonNull({ 
     name: 'Id', 
     description: '...', 
     fields: { 

     } 
     }), 
     resolve: (offer) => offer.id 
    }, 
    }), 
}); 

但是我怎麼能指定這種類型,我的id可以是一個int或一個對象?

這是我的查詢定義:

const QueryType = new GraphQLObjectType({ 
    name: 'Query', 
    description: '...', 
    fields:() => ({ 
    offers: { 
     type: OffersType, 
     args: { 
     limit: { type: GraphQLInt }, 
     page: { type: GraphQLInt }, 
     sort: { type: GraphQLString }, 
     filters: { [HERE] } 
     }, 
     resolve: (root, args, context, info) => { 
     const gqlFields = graphqlFields(info); 
     const fields = Object.keys(gqlFields.offer); 
     const queryArgs = args; 

     queryArgs.fields = fields; 

     return getOffers(queryArgs); 
     } 
    }, 
    }), 
}); 

這是我用的SuperAgent

const getOffers = (args) => { 
    const queryArgs = args; 

    if (typeof queryArgs.limit !== 'undefined') { 
    queryArgs.limit = args.limit; 
    } else { 
    queryArgs.limit = Number.MAX_SAFE_INTEGER; 
    } 

    return new Promise((fulfill, reject) => { 
    request 
     .get(API_URL) 
     .query(qs.stringify(args)) 
     .end((err, res) => { 
     if (err) { 
      reject(err); 
     } 

     fulfill(res); 
     }); 
    }); 
}; 

我需要這個對象來構建我的決心功能的查詢請求。感謝大家的幫助!我只需要簡單的建議!

回答

1

這是不允許的,由設計:https://github.com/graphql/graphql-js/issues/303

GraphQL不支持未知屬性名稱,主要是因爲它將使模式毫無意義。給出的例子是一個簡單的拼寫錯誤:

如果有查詢query ($foo: String) { field(arg: $foo) }和變量{ "fooo": "abc" },目前我們將此標記爲錯誤,但我們可能會錯過這個錯字,如果我們沒有引發錯誤。

該模式旨在確保服務器和客戶端之間的兼容性,即使在不同版本之間,並允許未知屬性也會破壞該模式。

GraphQL-JS庫中有一個merge request open for this,但它是still being debated,並且存在與拼寫錯誤和一般不一致的問題。

返回原語或對象的想法會遇到類似的問題。在接受對象時,您需要列出您期望的屬性,並且查詢將針對該模式驗證這些屬性。必須提前知道屬性及其類型和空值,以便您(和解析器)能夠生成查詢,並且在驗證時肯定需要知道。

如果您可以接受基元或對象,則必須指定該對象上的字段,但這些字段不可能存在於基元上。這是一個問題。

+0

我知道所有的屬性名稱(我將它添加到我的問題),但我怎麼能定義參數可以是一個int或一個對象? –

+0

對於數組,您應該要求該字段始終是一個數組,並且只需使用一個元素的數組。我不認爲允許一個字段是一個原始對象或對象也是一個好主意,你可能需要它永遠是一個對象,並使一些子字段可選。 – ssube