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

Apollo Server - parse REST result in Connector, Resolver or Model

我正在用 Apollo 服务器包装一个旧的 REST API 服务。调用 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)
        })
      })
  }

解析器

解析器方法收到一个承诺,但结果不能被操纵:

const allCats = (_, params, context) => context.cat.getCats()
.then((data) => { // to late to manipulate data here })

型号

该模型看起来很有前途,但不太确定如何构造它:

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

Apollo 将(通常)与 REST API 集成。我期待着找到处理这种情况的最佳方法。

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

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