当前位置: 首页 > 知识库问答 >
问题:

GraphQL字段未定义

方飞白
2023-03-14

从GraphQL/Node/Express/Types cript堆栈开始,我遇到了一个问题,即字段参数没有传递给解析器函数。我有两个查询:

用户列表:

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
      }
    ]
  }
}

显然,userIsLocked没有在where()函数上传递fields参数。但是,以下工作:

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
    }
  }
}

当用户ID登录到对getById()的请求时,我在控制台中看到了“a4f1d968-52d6-4148-bf62-1e132a4defde”。但是,当登录到对where()的请求时,控制台中显示的所有内容都是未定义的,我的查询默认显示所有用户。我不明白为什么两个显然相等的查询会以如此不同的方式运行。我已经搜索了GraphQL的文档,但我所能找到的只是示例查询和一般查询结构。

共有1个答案

西门庆
2023-03-14

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

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

在这里,您使用对象解构语法从第二个参数解包userId属性,并将其签名到同名变量。然后,使用速记属性名称语法创建一个具有用户ID属性的对象(使用定义的变量值),并将此对象传递给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 })
}

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

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

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

 类似资料:
  • 当客户机发送请求时,我想知道客户机请求的数据字段是什么。例如 在上面的请求中,客户端请求了用户的字段和字段。在执行查询时,我如何知道/获得桑格利亚酒-graql服务器中的这些指定字段,即名称和地址?

  • 我目前正在使用NodeJS尝试GraphQL,我不知道为什么在以下查询中出现此错误: 我不确定,如果我的是正确的,因为在任何例子中,我都看到他们使用了,但在我的情况下,我真的想返回一个用户对象,而不是用户数组。 我的代码: 错误: 因此,我的模式提供了一个字段,该字段返回正确的数据(console.log)。

  • 例如,endpoint 因此,如果有人将以下json发送到我的endpoint,endpoint应该接受它 但如果发送以下json,则失败,因为它不包含。

  • 介绍 model 参考文档已经介绍了如何使用 Django 的标准字段类;例如 CharField, DateField,等等。对于很多应用来说,这些类足够用了。 但是在某些情况下, 你所用的Django 不具备你需要的某些精巧功能,或是你想使用的字段与 Django 自带字段完全不同。 Django 内置的字段类型并不能覆盖所有可能遇到的数据库的列类型,仅仅是些普通的字段类型,例如VARCHAR

  • 我很困惑如何创建一个Resolver正确地在图ql-组成:我有两个相关的实体:entityGroup和实体。我想在每次创建实体组时创建一个默认实体:所以我需要调用EntityG的解析方法roup.createOne,然后使用结果的id调用“Entity.createOne” 这是我到目前为止写的代码: 现在从客户端开始,我调用了与我在entityGroupCreate使用预退出解析程序的原始情况中

  • 我正在努力学习GraphQL( 我只得到一级字段,比如: 以下是我的模式: 我的解析器: 知道我做错了什么吗?