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
设为箭头函数。