Javascript Apollo GraphQL:如何拥有使用递归的解析器?
我的数据库被建模为“森林”或一组树。有顶级节点可以链接到它下面的多个节点,每个节点都可能链接到它下面的节点 我想实现一个解析器,找到一棵树并删除它。这意味着它必须找到顶级节点,搜索其子节点,删除它们,然后搜索它们自己的子节点,等等。我不知道如何用解析器实现这个递归 这种递归结构类似于Javascript Apollo GraphQL:如何拥有使用递归的解析器?,javascript,apollo,react-apollo,apollo-server,resolver,Javascript,Apollo,React Apollo,Apollo Server,Resolver,我的数据库被建模为“森林”或一组树。有顶级节点可以链接到它下面的多个节点,每个节点都可能链接到它下面的节点 我想实现一个解析器,找到一棵树并删除它。这意味着它必须找到顶级节点,搜索其子节点,删除它们,然后搜索它们自己的子节点,等等。我不知道如何用解析器实现这个递归 这种递归结构类似于 function deleteNodes(rootID) { root = database.find(id: rootID); if (!root.childrenIDs) return;
function deleteNodes(rootID) {
root = database.find(id: rootID);
if (!root.childrenIDs) return;
database.delete(id: rootID);
root.childrenIDs.map((childId) => deleteNodes(childId));
}
但我不确定这在解析器中如何工作,我的代码结构如下所示:
module.exports {
Query: {...},
Mutation: {
deleteNodes: async (_, args) => {...}
}
}
我如何设计助手函数或递归调用解析器,或者如果这是不允许的,我如何执行我想要的?我不确定是否可以直接在冲突解决程序内部调用冲突解决程序。我的规则可以在这里帮助您,冲突解决程序中不应该包含业务逻辑。我使用apollo server和
数据源
,但在此之前,我有一个类似的设置,其中上下文
对象包含我所有的业务逻辑。通过这种方式,解析器就是“路由器”,您可以用REST+Express、gRPC或任何您想要的东西来替换GraphQL
我在这里使用的是数据源模型,但是您可以只使用一组“业务逻辑帮助器”。我在上下文中执行所有这些操作,这样我就可以更容易地插入它们进行测试
这意味着在这种情况下,您的解析器将如下所示:
module.exports={
查询:{…},
突变:{
deleteNodes:async(\uz,args,context)=>{
const result=await context.dataSources.nodes.deleteNodes(args.id);
//处理你的结果
回报一切;
}
}
}
另外,您将拥有一些节点
数据源:
const{DataSource}=require('apollo-DataSource'))
module.exports=类NodesDataSource扩展了DataSource{
构造函数(){
这个数据库=某物;
}
deleteNodes(rootID){
const root=wait this.database.find(id:rootID);
如果(!root.childrenIDs)返回;
等待这个.database.delete(id:rootID);
等待Promise.all(root.childrenIDs.map((childId)=>this.deleteNodes(childId));
}
}
在Apollo服务器设置中:
const NodesDataSource=require('./datasources/NodesDataSource');
const server=新服务器({
解析器,
typeDefs,
数据源:()=>{
返回{
节点:新节点数据源(),
};
},
});
使用命名函数,并像以前一样递归调用它。没有理由将deleteNodes
设为箭头函数。