node.js - 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
}
解决方案
推荐阅读
- python-3.x - create dataframe using the values from csv file, (Displays NaN values)
- java - Spring application from Standalone class without deploying WAR
- javascript - How to get specific number from table using selenium if location is static for every zip code?
- react-native - 如何运行基于 expo 构建的聊天应用程序的两个不同实例?
- python-3.x - 通过剥离在熊猫中格式化日期时间值
- python - 如何找到两个csv之间的差异总和
- r - 如何使用 rvest 获取动态 html 标签?
- sapui5 - 在控制器中获取语义对象和语义动作
- google-cloud-platform - 我想从存储在 Google Cloud 中的传感器数据中知道有人应该遵循的程序来执行驱动任务
- npm - 我无法成功使用 install npm packages