首页 > 解决方案 > 概念性问题:多个端点的共享 GraphQL 架构(客户端/管理员)

问题描述

上下文
我正在使用 NX 工作区来组织两个不同的 Angular 前端(客户端和管理员)。为了分离客户端和管理逻辑,包括 GraphQL 在内的两种不同的 NestJS 后端服务用于客户端和管理。由于两个服务都从单个 MongoDB 获取数据,因此两个前端都使用单个数据库库。

在此处输入图像描述

两种后端服务目前都使用通过模式优先方法和单个数据库层生成的单个 GraphQL Schema。在大多数情况下,客户端和管理员之间的类型和字段定义匹配,但在某些情况下,单个服务需要额外的查询参数或字段。例如,管理服务取决于字段confirmedbanned类型User,而它们不应该通过客户端服务可用。此外,例如getUsers查询不应通过客户端服务公开。

type User {
    _id: ID
    name: String
    email: String

    confirmed: Boolean
    banned: Boolean
}

type Query {
    getUserById(userId: String): User
    getUsers(): [User]
}

问题
在类型几乎相似的情况下,是否有任何最佳实践如何继续使用 GraphQL 模式。

标签: graphqlnestjsmonorepo

解决方案


您可以使用模式指令直接在 Graphql 模式中以声明性方式定义授权规则。

一种常见的方法是将角色分配给用户,然后使用这些角色来允许/阻止对某些突变或查询的访问。

因此,对于您的示例,我想来自 的任何请求都将由client角色为的用户client发出,而来自 admin 的任何请求的用户角色为admin

因此,要以您将getUsers查询限制为仅的示例为基础,admins我们可以将此指令添加到我们的架构中:

type User {
    _id: ID
    name: String
    email: String

    confirmed: Boolean
    banned: Boolean
}

type Query {
    getUserById(userId: String): User 
    getUsers(): [User] @hasRole(roles: [admin])
}

hasRoles您可以在 nestJs 文档https://docs.nestjs.com/graphql/directives中阅读有关如何实际实现自定义指令的更多信息


推荐阅读