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】:
我猜测从数据库返回的docId
和docTitle
的类型不是明确的字符串,因此,某处发生了一些类型检查,导致它们的值被从输出docs
对象中删除。尝试将 lean option 添加到查询中,以便查询结果中的每个文档都转换为 javascript 对象,这将有助于确保将值 docId
和 docTitle
转换为字符串。
将您的数据库查询更新为以下内容:
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 字段的类型作为查询结果