Graphql Apollo服务器-在连接器、解析器或模型中解析REST结果

Graphql Apollo服务器-在连接器、解析器或模型中解析REST结果,graphql,apollo,Graphql,Apollo,我正在用Apollo服务器包装一个旧的RESTAPI服务。对REST服务的调用会产生一个JSON对象,该对象将有效负载嵌套在2到3层的深度。例如: { - MRData: { - CatTable : { - Cats : [] 更复杂的是,每个资源端点的嵌套模式和节点名称都不同。因此,我的问题是,因为每个资源结果都需要自定义操作,所以最好在哪里进行操作:在连接器、解析器或模型中 连接器 如果在连接器中完成,则每个资源都需要一个自定义方法。好像有很多陈词

我正在用Apollo服务器包装一个旧的RESTAPI服务。对REST服务的调用会产生一个JSON对象,该对象将有效负载嵌套在2到3层的深度。例如:

{ 
  - MRData: {
      - CatTable : {
           - Cats : []
更复杂的是,每个资源端点的嵌套模式和节点名称都不同。因此,我的问题是,因为每个资源结果都需要自定义操作,所以最好在哪里进行操作:在连接器、解析器或模型中

连接器

如果在连接器中完成,则每个资源都需要一个自定义方法。好像有很多陈词滥调

public fetchCats(resource: string) {    
    return new Promise<any>((resolve, reject) => {
      request.get(url, (err, resp, body) => {
        err ? reject(err) : resolve(JSON.parse(body).MRData.CatTable.Cats)
        })
      })
  }
型号

该模型看起来很有希望,但不确定如何构建:

public getCats() {
    const cats = this.connector.fetchCats('/cats.json');
    return cats;
  }

Apollo将(通常情况下)与RESTAPI集成。我期待着找到处理这个案件的最佳方法

我通常建议在连接器中进行解析,因为它们应该抽象后端的细节。如果连接器通过后端进行抽象,那么在适当的时候,您应该能够从一个后端切换到另一个后端。例如,您可以从查询REST API切换到直接将查询发送到数据库,这样才有意义


这样做的结果是,您需要为每个REST API构建一个新的连接器,因为没有两个REST API是相同的。

您在抽象层提出了一个很好的观点。因此,解决方案是为每个资源类型构建一个fetch()和fetchPage(),因为这个特定的REST API会为每个资源创建一个自定义节点名。或者最好将resource\u type参数传递给fetch()-类似于
fetch(url,resourceType)
,然后创建枚举,比如
CAT\u type=“MRData.CatTable.Cats”
DOG\u TYPE=“MRData.DogTable.Dogs”
来分类每个资源要使用的解析结构。
public getCats() {
    const cats = this.connector.fetchCats('/cats.json');
    return cats;
  }