【问题标题】:GraphQL Fields UndefinedGraphQL 字段未定义
【发布时间】:2019-06-06 22:34:57
【问题描述】:

从 GraphQL / Node / Express / Typescript 堆栈开始,我遇到了字段参数未传递给解析器函数的问题。我有两个疑问:

用户列表:

UserList: {
        type: new GraphQLList(UserType),
        args: {
            userName: {
                type: GraphQLString
            },
            userIsLocked: {
                type: GraphQLBoolean
            },
            userIsConfirmed: {
                type: GraphQLBoolean
            },
            userAwaitingPassword: {
                type: GraphQLBoolean
            }
        },
        resolve: ((_, {fields}) => new User().where({fields}))
    }

和用户:

User: {
    type: UserType,
    args: {
        userId: {
            type: GraphQLID
        }
    },
    resolve: ((_, {userId}) => new User().getById({userId}))
}

如果没有提供标准,User().where() 函数默认显示所有用户。但是,请考虑以下查询和结果:

query All {
  UserList(userIsLocked:true){
    userId
    userName
    userIsLocked
  }
}

// Results
{
  "data": {
    "UserList": [
      {
        "userId": "a4f1d968-52d6-4148-bf62-1e132a4defde",
        "userName": "user1",
        "userIsLocked": false
      },
      {
        "userId": "b42a1170-096a-11e9-b568-0800200c9a66",
        "userName": "administrator",
        "userIsLocked": false
      }
    ]
  }
}

显然,where() 函数上的字段参数未传递 userIsLocked。但是,以下工作:

query Individual {
  User(userId: "a4f1d968-52d6-4148-bf62-1e132a4defde") {
    userId
    userName
    userIsLocked
  }
}

// Results
{
  "data": {
    "User": {
      "userId": "a4f1d968-52d6-4148-bf62-1e132a4defde",
      "userName": "user1",
      "userIsLocked": false
    }
  }
}

userId 登录到getById() 的请求时,我在控制台中看到{"userId":"a4f1d968-52d6-4148-bf62-1e132a4defde"}。但是当fields 登录到where() 的请求时,控制台中显示的所有内容都是undefined,并且我的查询默认显示所有用户。我无法弄清楚为什么 2 个明显相等的查询会以如此不同的方式表现。我已经搜索了 GraphQL 的文档,但我能找到的只是示例查询和一般查询结构。

【问题讨论】:

    标签: node.js graphql graphql-js


    【解决方案1】:

    传递给resolve 函数的第二个参数是一个对象,其属性映射到该字段的参数。让我们看看正在工作的解析器:

    resolve: (_, {userId}) => new User().getById({userId})
    

    在这里,您使用object destructuring syntax 解压缩第二个参数中的userId 属性并将其签名到同名变量。然后,您使用shorthand property name syntax 创建一个具有userId 属性的对象(使用您定义的userId 变量的值)并将该对象传递给getById 方法。

    这在语法上等价于以下函数:

    resolve: (_, args) => {
      const userId = args.userId
      return new User().getById({ userId: userId })
    }
    

    从您的问题中不清楚您使用的是什么 ORM,因此我无法判断您是否在其他解析器中正确调用了 where 方法。但是,您绝对不会解压缩该字段的任何参数。这是你的功能:

    resolve: (_, {fields}) => new User().where({fields})
    

    相当于:

    resolve: (_, args) => {
      const fields = args.fields
      return new User().where({ fields: fields })
    }
    

    您的字段有以下四个参数:userNameuserIsLockeduserIsConfirmeduserAwaitingPasswordfields 不是有效参数,因此将始终未定义,除非您将名为 fields 的参数添加到您的 UserList 字段并实际传递它。我会冒险猜测并说您的模型也没有fields 属性。如果您只是想将 arguments 对象传递给where 方法,您可以这样做:

    resolve: (_, fields) => new User().where(fields)
    

    请注意缺少花括号。同样,您还没有告诉我们您正在使用什么 ORM 或用户模型本身,因此如果您没有正确使用 that API,这仍然可能无法为您提供所需的结果。不过,希望这能让您走上正轨。

    【讨论】:

    • 就是这样。取下大括号后,我看到它实际上是在用这些键喂一个对象。
    猜你喜欢
    • 2020-01-09
    • 2020-06-25
    • 2021-04-07
    • 1970-01-01
    • 2020-02-18
    • 2020-04-01
    • 2023-01-20
    • 2021-05-14
    • 2014-09-03
    相关资源
    最近更新 更多