Graphql查询只解析_id字段,其他字段为空

Posted

技术标签:

【中文标题】Graphql查询只解析_id字段,其他字段为空【英文标题】:Graphql query is only resolving _id field, the other fields are null 【发布时间】:2020-07-08 00:48:29 【问题描述】:

我的 GraphQL 查询将 docID 和 docTitle 解析为 null。尽管正在从数据库中检索数据。仅返回 _id 字段。当我控制台日志时,我可以看到数据。

GraphQL 查询

query
  docs
    docId
    docTitle
    _id
  

我的解析器

const getDocs = async (_parent, _args, context, _info) => 
    const docs = await context.app.models.docs.find()
    return docs

文档架构

type Docs 
    _id: ID!
    docId: String
    docTitle: String

在 GraphQL 操场上,这就是我得到的


  "data": 
    "getDocs": [
      
        "docId": null,
        "docTitle": null,
        "_id": "5e7c9007f4c3"
      
    ]
  

但是当我控制台日志时,我可以看到所有字段的数据

[
  
    _id: 5e7c9007f4c3,
    docId: 'c18c-57e4b5134cbe',
    docTitle: 'cloud',
    __v: 0
  
]

请问我错过了什么?

【问题讨论】:

您好!请问,你能分享docs 架构吗? @Tunmee 我已经用架构更新了问题 我的意思是 docs mongoose 模式,而不是 graphql 类型。您使用类似new mongoose.Schema( ... ) 定义的架构。我是根据您使用猫鼬的假设来问这个的,如果不是这样,请告诉我。 @Tunmee 是的,我使用的是猫鼬,但没有架构。因此,在定义我的模型时,我将猫鼬设置传递给 false 以允许我在没有架构 mongoose.model('docs', new mongoose.Schema(, strict: false )) 的情况下使用它 在这种情况下,请尝试设置lean 选项。所以查询是这样的:await context.app.models.docs.find(, , lean: true ) 【参考方案1】:

我猜测从数据库返回的docIddocTitle 的类型不是明确的字符串,因此,某处发生了一些类型检查,导致它们的值被从输出docs 对象中删除。尝试将 lean option 添加到查询中,以便查询结果中的每个文档都转换为 javascript 对象,这将有助于确保将值 docIddocTitle 转换为字符串。

将您的数据库查询更新为以下内容:

await context.app.models.docs.find(, ,  lean: true )

【讨论】:

【参考方案2】:

使用aggregate 参数也能正确解析查询

const getDocs = async (_parent, _args, context, _info) => 
return await context.app.models.docs.aggregate([
    
        $project:  docId:1, docTitle:1 ,
    ,
])

【讨论】:

以上是关于Graphql查询只解析_id字段,其他字段为空的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL:返回具有不可为空 id 字段的类型作为查询结果

中继/ graphql:可为空的响应或捕获查询错误的方法

具有多个嵌套解析器并将字段映射到参数的 GraphQL 查询

GraphQL 查询:如果不为空,则仅包含字段

GraphQL 查询:如果不为空,则仅包含字段

如果字段为空,如何在graphql结果中显示NULL