首页 > 解决方案 > GraphQL 动态模式

问题描述

在 GraphQL 领域相对较新,我目前正在尝试将现有的 REST API 转换为 GraphQL API。来自 REST 系统,我一直在尝试遵循关于 GraphQL 的不同哲学,以便更好地理解不同的概念。在这一点上,如果你愿意,我会问一些问题。

关于我的项目,目前,REST API 被设计为完全动态的(使用 MongoDB 和 Symfony)。例如,我们使用ReflectionClass来使所有内容相似并避免控制器中的代码重复。关于新的 API,它将在 nodeJS 环境中运行。

所以,我的问题是:您认为在设计 GRAPHQL API 时可以想象类似的逻辑吗?

经过一些研究,如果我很好理解,似乎这个系统非常依赖于静态模式概念(.gql 文件),让最终用户定义所有查询。全局模式或原型模式是个好主意吗?我的意思是定义继承或类似的种类。

关键是,在我将 REST API 转换为新的 Graphql 的实现测试期间,我必须在 JS、Graphql (.gql) 中使用 mongoose 重新定义每个模型,并定义相关的解析器。也许我错过了什么或做错了什么,但在我的解析器中,很多字段被复制/粘贴(例如 dbref)。此外,当我考虑维护时,如果明天我们添加一个新字段怎么办?我们是否需要在 mongoose 和 Graphql 中明确定义它?

您是否遇到过同样的问题或找到任何解决方法?我很乐意谈论和分享它!

谢谢

人物解析器示例:

Query: {
    //single person
    async person(obj, args, context, fieldASTs) {
        if (args.id) {
            const projection = mongoose.makeProjections(fieldASTs);

             return await person.findById({
                '_id': ObjectId(args.id)
            }, projection);
         }

        return null;
    },
    // all persons
    async persons(obj, args, context, fieldASTs) {
        const projection = mongoose.makeProjections(fieldASTs);

        return await person.find({}, projection);
   }
},
person: {
    async root(obj, args, context, fieldASTs) {
        if (!obj) {
            return null;
        }

        const projection = mongoose.makeProjections(fieldASTs);

        return await Person.findById({
           '_id': ObjectId(obj.root)
        }, projection);
    }
}

graphql 架构

type Person {
  id:            ID
  created:       Date
  root:          Person
  name:          String
}

type Query {
   persons: [Person]
   person(id: ID): Person
}

标签: node.jsmongodbmongoosegraphqlgraphql-js

解决方案


推荐阅读