Вернуть один результат из двух резолверов GraphQL - PullRequest
0 голосов
/ 21 сентября 2018

Я хочу объединить результаты двух запросов в один для моей схемы GraphQL.У меня есть типы stock и price, каждый из которых разрешается индивидуально, но я не знаю, как объединить результаты.Вот мои typedefs и resolvers`:

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
  }
}

Я использую источники данных иФайл выглядит так:

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 обрабатывает распознаватели?

Будет ли рекомендовано возвращать оба запроса в преобразователе через обещание?Я не уверен, куда идти отсюда.

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Я рассмотрел это далее, и то, что вы назвали «нижним фондовым блоком», в терминах GraphQL называется nested resolver.Вот что я придумал для моего дополнительного резольвера:

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

Кажется, это одно и то же?

0 голосов
/ 22 сентября 2018

Я полагаю, что то, что у вас есть, будет работать со следующими настройками ваших резольверов:

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, как разрешить поле cost для типа Stock.Обратите внимание, что в обработчике запросов корневых запасов я также распространяю ответ с символом, чтобы он был доступен в первом аргументе распознавателя поля затрат.Возможно, у вас есть лучший способ загрузки цены с учетом информации об акциях, но вы можете просто отказаться от показанной схемы.

...