GraphQL.js Node/Express:如何将对象作为 GraphQL 查询参数传递

Posted

技术标签:

【中文标题】GraphQL.js Node/Express:如何将对象作为 GraphQL 查询参数传递【英文标题】:GraphQL.js Node/Express: How to pass object as GraphQL query argument 【发布时间】:2017-08-01 01:32:17 【问题描述】:

我的目标是能够在 GraphQL 查询中将对象作为参数传递。

目标:


    accounts (filter: 
      "fieldName": "id",
      "fieldValues":["123"],
      "filterType":"in")
        id
      
 

错误:

"message": "filterType fields must be an object with field names as keys or a function which returns such an object."

我尝试了几种不同的方法,但这似乎是最接近潜在解决方案的方法。

架构:

const filterType = new GraphQLObjectType (
  name: 'filterType',
  fields: 
    fieldName:  type: GraphQLString ,
    fieldValues:  type: GraphQLString ,
    filterType:  type: GraphQLString ,
  
)

const QueryType = new GraphQLObjectType(
  name: 'Query',
  fields: () => (
    accounts: 
      type: new GraphQLList(accountType),
      args: 
        filter:  type: new GraphQLInputObjectType(filterType) ,
      ,
      resolve: (root, args,  loaders ) => loaders.account.load(args),
    ,

  ),
);

【问题讨论】:

【参考方案1】:

我在这里找到了解决方案。 https://github.com/mugli/learning-graphql/blob/master/7.%20Deep%20Dive%20into%20GraphQL%20Type%20System.md#graphqlinputobjecttype

架构:

const filterType = new GraphQLInputObjectType(
  name: 'filterType',
  fields: 
    fieldName:  type: GraphQLString ,
    fieldValues:  type: GraphQLString ,
    filterType:  type: GraphQLString ,
  
)

const QueryType = new GraphQLObjectType(
  name: 'Query',
  fields: () => (
    accounts: 
      type: new GraphQLList(accountType),
      args: 
        filter:  type: filterType ,
      ,
      resolve: (root, args,  loaders ) => 
        return loaders.account.load(args),
    ,
  ),
);

问题出在查询中,我将键和值都作为对象参数中的字符串。

正确查询:


  accounts(filter: fieldName: "id", fieldValues: "123", filterType: "in") 
    id
  

【讨论】:

创建GraphQLInputObjectType 并以您在查询中的方式使用它没有任何意义 - 您可以简单地在args 中定义这些字段,而不是创建新的输入类型... @piotrbienias args 使用GraphQLInputObjectType。像这样使用没有任何意义,但为什么呢?这不能被认为是一种更清洁的方式吗?即使在 args 中,我们也必须定义字段和类型【参考方案2】:

您没有将 filterType 定义为对象类型,然后将其包装在输入类型中,而是将其创建为输入类型:

const filterType = new GraphQLInputObjectType(
  name: 'filterType',
  fields: 
    fieldName:  type: GraphQLString ,
    fieldValues:  type: GraphQLString ,
    filterType:  type: GraphQLString ,
  
)

const QueryType = new GraphQLObjectType(
  name: 'Query',
  fields: () => (
    accounts: 
      type: new GraphQLList(accountType),
      args: 
        filter:  type: filterType ,
      ,
      resolve: (root, args,  loaders ) => loaders.account.load(args),
    ,
  ),
);

您还需要在查询时声明其类型,如@piotrbienias 的回答所示。

【讨论】:

您好安德鲁,感谢您的意见。我尝试了此解决方案,但收到与以前相同的错误。 “语法错误 GraphQL 请求 (3:8) 预期名称,找到字符串”

以上是关于GraphQL.js Node/Express:如何将对象作为 GraphQL 查询参数传递的主要内容,如果未能解决你的问题,请参考以下文章

node + express +mongoose 实现基本登录注册

Graphql + Relay graphql-relay-js 依赖

错误 cb.apply 不是 Node Express 项目中的功能 [尝试安装软件包时] --

Node.js_express_中间件 middleware_登录/注册实例

如何添加node express 为windows 启动服务器

运行 Mongoose 时执行 ajax 调用时如何处理 Node.js 发现