为啥我的查询没有返回枚举数组

Posted

技术标签:

【中文标题】为啥我的查询没有返回枚举数组【英文标题】:Why is my query not returning an array of Enums为什么我的查询没有返回枚举数组 【发布时间】:2019-11-13 18:28:26 【问题描述】:

我在查询 GraphQL 查询中的枚举数组时遇到了一些问题。我期望数组或权限将根据类型与用户一起返回

奇怪的是,当我在操场上进行相同的查询时(对于我的 Prisma 或 Apollo-Server 服务器),我确实取回了数组。

我的查询如下所示:

const user = await ctx.db.query.user(
  where: 
    id: ctx.userId
  
);

我的类型定义如下所示:

type User 
    id: ID! @id
    name: String!
    email: String! @unique
    password: String!
    club: String!
    permissions: [Permission!]! @scalarList(strategy: RELATION)
    createdAt: DateTime! @createdAt
    updatedAt: DateTime! @updatedAt

权限看起来像

enum Permission 
    ADMIN
    CLUB_ADMIN
    USER
    FRIEND

我没有包含我的查询解析器,因为我刚刚使用“转发到”将其转发到数据库

但是用户的CL是

 id: 'cjxm9ohfqvkvh0b5963iy734i',
  name: 'BERTIE BOBBINS',
  email: 'BERTIE@DOGS.COM',
  password: '$2b$10$eLPoBuuenogLabiFb4tRFu0KV7LI4LxARhHecPYVbP0qnt5VvcZ3W',
  club: 'Dog Club',
  createdAt: '2019-07-02T20:30:49.670Z',
  updatedAt: '2019-07-02T20:30:49.670Z' 

所以不包括 Permissions 数组。

【问题讨论】:

如果它在操场上有效,它就有效,所以问题一定是您的客户端查询。为什么用户拥有一系列权限?一个用户不是只有一种权限类型吗? 每个权限都与一组不同的权限相关,可以是用户,也可以是俱乐部管理员、管理员等。我还没有进入客户端查询。这只是查询 prisma db 和 Apollo server db,查询直接取自生成的模式。我认为,当使用枚举数组创建记录时,您必须使用“集合”,我是否需要显式“获取”数组的内容,如果需要,操场如何以及如何工作?跨度> 遇到了同样的问题。我还没有找到解决办法,但是如果你想返回权限字段,你需要将它作为返回字段传入,同时将info对象作为ctx.db.query.user的第二个参数传入功能 【参考方案1】:

Introspection系统这个自省类型

    __架构 __类型 __TypeKind __字段 __InputValue __EnumValue __指令

要查询枚举,您需要使用 __Type 查询解析器。

enum Permission 
    ADMIN
    CLUB_ADMIN
    USER
    FRIEND

查询枚举

query 

 __type(name: "Permission") 
   name
   enumValues 
     name
   
 

__type 查询解析器需要 name 参数。此参数允许您根据名称在架构中搜索对象和枚举等项目。


 "data": 
   "__type": 
   "name": "Permission", 
   "enumValues" : [
     
       name: "ADMIN" 
     ,
      
       name: "CLUB_ADMIN" 
     ,
      
       name: "USER" 
     ,
      
       name: "FRIEND"
     
   ]
  
 

这将返回枚举的名称及其所有值。 要使用这些值,请在查询枚举时将它们存储在变量中。

PermissionsList = data.__type.enumValues

如果您需要在用户对象ref this 中进行枚举

如果您使用 apollo 服务器,请阅读 apollo-server 和 graphql-tools

【讨论】:

这是为了获取特定用户的权限数组还是自省枚举的可能值是什么? 现在,您可以返回枚举。如果您需要特定用户的权限,您可以返回一个数组。请检查您的查询解析器并返回array of string。【参考方案2】:

我不太明白:您提到您只是使用了prisma-binding forwardTo 函数,然后提供您的示例查询,您使用ctx.db.query.user 从上下文转发到db。你在这两种情况下都有问题吗?

对于forwardTo 实例,我不知道答案。但是对于第二种情况,我也遇到了这个问题,并且能够通过将解析器函数签名中的 info 对象作为查询的第二个参数传入来解决它。

const user = await ctx.db.query.user(
  
    where: 
      id: ctx.request.userId
    
  ,
  info
);

【讨论】:

以上是关于为啥我的查询没有返回枚举数组的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的查询没有返回任何结果?

Swift - 为啥 Process.arguments 返回空数组

为啥我的 bigquery sql 没有返回任何结果?

为啥查询的数据在结果集中返回而不是在数组中?

为啥数组响应没有使用 PHP MySQL API 进入 JSON

为啥 CodeIgniter 不会在括号中返回 SQL 查询的结果?