【问题标题】:Return one result from two GraphQL Resolvers从两个 GraphQL 解析器返回一个结果
【发布时间】:2018-09-22 21:29:27
【问题描述】:

我希望将两个查询的结果合并为一个用于我的 GraphQL 架构。我有一个stockprice 类型,每个都单独解决,但我不知道如何组合结果。 这是我的typedefs 和解析器:

const typeDefs = gql`
    type Query{
        stock(symbol: String!): Stock
        price(symbol: String!): Price
    }

    type Stock {
        companyName: String
        exchange: String
        industry: String
        sector: String
        tags: [String]
        cost: Price
    }

    type Price {
        cost: String
    }

`;

const resolvers = {
    Query:{
        stock: async(root, {symbol}, {dataSources}) =>{
            return dataSources.myapi.getSomeData(symbol)
        },
        // dont have a name for your property? ADD ONE!
        price: async(root, {symbol}, {dataSources})=>{
            return {'cost': dataSources.myapi.getAPrice(symbol)}
        }
    }
};

如果我像这样运行查询,我会得到 null 的股票价格:

query{
  stock(symbol:"aapl"){
    tags
    cost{
      cost
    }
  }
}

结果是这样的:

{
  "data": {
    "stock": {
      "tags": [
        "Technology",
        "Consumer Electronics",
        "Computer Hardware"
      ],
      "cost": null
    }
  }
}

但是,如果我运行价格查询,我会得到价格的预期结果:

query{
  price(symbol:"aapl"){
      cost
  }
}

我正在使用datasources,文件看起来像这样:

class MyApi extends RESTDataSource{
    constructor(){
        super();
        this.baseURL = 'https://api.iextrading.com/1.0';
    }

    async getAPrice(symbol){
        return this.get(`/stock/${symbol}/price`);
    }

    async getSomeData(symbol){
        return this.get(`/stock/${symbol}/company`)
    }
}

module.exports = MyApi;

我想知道为什么会这样。是否有什么我做得不好,或者缺乏对 GraphQL 处理解析器的某种方式的理解?

是否建议通过 Promise 在解析器中返回两个查询?我不知道从这里去哪里。

【问题讨论】:

    标签: javascript graphql apollo graphql-js apollo-server


    【解决方案1】:

    我对此进行了进一步研究,您所说的“底部库存块”在 GraphQL 术语中称为nested resolver。以下是我为我的额外解析器提出的建议:

    Stock:{
        price: async(company, args, {dataSources})=>{
            return {'cost': dataSources.myapi.getAPrice(company.symbol)}
        }
    }
    

    这似乎是一回事吗?

    【讨论】:

      【解决方案2】:

      我相信您所拥有的将与您的解析器的以下调整一起使用:

      const resolvers = {
          Query: {
              stock: async(root, {symbol}, {dataSources}) => {
                  const stock = await dataSources.myapi.getSomeData(symbol)
                  return {...stock, symbol: symbol}
              },
              // dont have a name for your property? ADD ONE!
              price: async(root, {symbol}, {dataSources}) => {
                  const cost = await dataSources.myapi.getAPrice(symbol)
                  return {cost: cost}
              }
          },
          Stock: {
            cost: async (stockWithSymbol, args, {dataSources}) => {
              const cost = await dataSources.myapi.getAPrice(stockWithSymbol.symbol)
              return {cost: cost}
            }
          }
      };
      

      底部的 Stock 块告诉 GraphQL 如何解析 Stock 类型上的 cost 字段。请注意,在根库存查询解析器中,我还使用符号传播响应,以便它在成本字段解析器的第一个参数中可用。考虑到股票信息,您可能有更好的加载价格的方法,但只是脱离了显示的架构。

      【讨论】:

      • 我在const cost = await dataSources.myapi.getAPrice(stockWithSymbol.symbol) 的行上收到unexpected identifier 的错误。解决方案对您有用吗?数据源在我的控制台中作为意外标识符加了下划线。
      • 忘记将异步添加到嵌套解析器。它抱怨在没有异步的情况下使用等待
      猜你喜欢
      • 2019-01-08
      • 1970-01-01
      • 2020-12-23
      • 1970-01-01
      • 2020-10-23
      • 2017-07-10
      • 2018-02-13
      • 2019-07-25
      • 1970-01-01
      相关资源
      最近更新 更多