【问题标题】:Apollo Server - parse REST result in Connector, Resolver or ModelApollo Server - 在连接器、解析器或模型中解析 REST 结果
【发布时间】:2016-12-10 02:03:09
【问题描述】:

我正在使用 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)
        })
      })
  }

解析器

resolver 方法收到了一个 promise,但结果不能被操纵:

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 集成。我期待着找到处理此案的最佳方法。

【问题讨论】:

    标签: graphql apollo


    【解决方案1】:

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

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

    【讨论】:

    • 你提出了一个关于抽象层的好观点。因此解决方案是为每种资源类型构建一个 fetch() 和 fetchPage(),因为这个特定的 REST API 为每个资源创建了一个自定义节点名称。
    • 或者最好将 resource_type 参数传递给 fetch() - 类似于 fetch(url, resourceType),然后创建像 CAT_TYPE="MRData.CatTable.Cats"DOG_TYPE="MRData.DogTable.Dogs" 这样的 ENUM 来确定每个资源使用哪个解析结构。跨度>
    猜你喜欢
    • 2021-02-26
    • 2020-01-28
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 2019-08-01
    • 2021-08-22
    • 2018-10-04
    • 2016-12-13
    相关资源
    最近更新 更多