【问题标题】:Create GraphQL connection between User and Role Type via Role and query them通过 Role 在 User 和 Role Type 之间创建 GraphQL 连接并查询它们
【发布时间】:2019-10-12 16:00:58
【问题描述】:

我想在 User Role Role_Type 之间创建一个 GraphQL 连接,最后通过查询返回用户角色类型.下面将其分解为唯一重要的代码行:

type Query {
  getUsers: [User]
}
type User {
  _id: ID
  firstname: String
  roles: [Role]
}
type Role {
  _id: ID
  role_type_id: ID
  role_types: [Role_Type]
  user_id: ID
}
type Role_Type {
  _id: ID
  name: String
}

在用户解析器中我有:

Query: {
  getUser: async (root, { _id }) => {
    return prepare(await DBUsers.findOne(ObjectId(_id)))
  }
},
User: {
  roles: async ({_id}) => {
    return (await MongoDBRoles.find({user_id: _id}).toArray()).map(prepare)
  }
}

对于角色解析器:

Role: {
  role_types: async ({_id}) => {
    return (await MongoDBRoleTypes.find({role_type_id: _id}).toArray()).map(prepare)
  },
},

当我现在查询时:

{
  getUser(_id: "5d555adcd2c22a242863f7a1") {
    firstname
    roles {
      _id
      role_type_id
      user_id
      role_types {
        name
      }
    }
  }
}

我明白了:

{
  "data": {
    "getUser": {
      "firstname": "Gregor",
      "roles": [
        {
          "_id": "5d90cf352f50882ab0ce3877",
          "role_type_id": "5d90ce48b7893d19bcc328f9",
          "user_id": "5d555adcd2c22a242863f7a1",
          "role_types": []
        }
      ]
    }
  }
}

但是为什么role_types 是空的。如您所见,role_type_id 已填满。那么为什么没有联系。

当我查看 MongoDB 时,我可以看到用户的角色类型。

如果您需要更多架构/解析器,请告诉我。

【问题讨论】:

  • 从上面还不清楚不同字段是如何相关的,但我假设根据你所说的role_types 与每个Role 相关,根据其role_type_id。如果是这种情况,您的解析器与该字段不匹配 - 您正在使用角色的 _id 代替。
  • 谢谢。所以你说通过替换_id来更改role_types: async ({_id}) => { return (await MongoDBRoleTypes.find({role_type_id: _id}).toArray()).map(prepare) },?但对我来说,这看起来不错。
  • 顺便说一句,我用@987654336 测试了你的想法@它也不起作用。

标签: graphql schema resolver


【解决方案1】:

好的,这很容易解决。实际上,角色解析器进行了多次匹配。但不知何故,它需要是单一的查找。这没有多大意义,但不知何故,对 id 查找的搜索是一次查找。无论如何,这是我所做的更改,现在它可以正常工作了。

替换这个:

role_types: async ({_id}) => {
  return (await MongoDBRoleTypes.find({role_type_id: _id}).toArray()).map(prepare)
},

与:

role_type: async ({role_type_id}) => {
  return prepare(await DBRoleTypes.findOne(ObjectId(role_type_id)))
},

然后你解决这个问题。

【讨论】:

    猜你喜欢
    • 2020-01-07
    • 2019-07-21
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 2021-04-29
    • 2016-10-24
    相关资源
    最近更新 更多