GraphQL错误返回mongoose聚合命令的结果

Posted

技术标签:

【中文标题】GraphQL错误返回mongoose聚合命令的结果【英文标题】:GraphQL error returning result of mongoose aggregate command 【发布时间】:2018-06-20 20:41:39 【问题描述】:

此问题与the answer posted here有关

我需要从 GraphQL 查询返回聚合结果。查询代码如下:

const companiesWithNoUsers = 
    type: new GraphQLList(CompanyType),
    resolve(root, args, context) 
        return Company.aggregate([
            
                $lookup: 
                    from: "users",
                    localField: "id",
                    foreignField: "company_id",
                    as: "company_users"
                
            ,
            
                $match: 
                    "company_users:0": 
                        $exists: false
                    
                
            
        ]).exec();
    
;

我在 GraphQL 上遇到以下错误:

Expected value of type \"Company\" but got: [object Object].

阅读the docs后,我想错误与以下语句有关:

“返回的文档是纯 javascript 对象,而不是 mongoose 文档(因为可以返回任何形状的文档)。”

所以,我需要返回一个 GraphQL CompanyType。如何将返回转换为 GraphQL 预期的格式?这个错误有其他解决方案吗?

【问题讨论】:

【参考方案1】:

您可以尝试将结果列表转换为 Mongoose 文档并将结果包装在 Promise 中:

Company.aggregate(pipeline).exec((err, result) => 
    (    
        new Promise((resolve, reject) => 
            if (err) 
                reject(err)
             else                     
                resolve(result.map(doc =>  
                    delete doc.company_users;
                    return new Company( doc );
                ))
            
        )
    ))

【讨论】:

不工作。 TypeError: _types.Company is not a constructor... 将对象转换为 GraphQLType 时出现问题Company... 以上Company是Mongoose文档 是的,我发现了。但仍然无法正常工作。同样的错误:"Expected value of type \"User\" but got: [object Object]."。我检查了输出,它是一组 Company mongoose 文档。不知道还缺少什么...实际上调用let company = new company(doc); console.log(Object.prototype.toString.call(company)) 我得到打印[object Object]....

以上是关于GraphQL错误返回mongoose聚合命令的结果的主要内容,如果未能解决你的问题,请参考以下文章

使用 Apollo-GraphQL、MongoDB-Mongoose 和 Node-Express 构建的 React 应用程序在生产构建中返回 404 错误

Mongoose 聚合:基于 Model.associated_Model.associated_Model.field 过滤返回错误结果

graphql mongoose 返回 null

返回突变结果的正确方法? (GraphQL 与 Apollo 和 Mongoose

使用 Mongoose 和 GraphQL 从填充模型有条件地返回值的最有效方法?

在 Mongo 聚合中使用 Cursor() 和 Mongoose