Haris Ghauri Ответов: 1

Как вернуть массив объектов в graphql ?


Я создаю API graphql, где я мог бы получить автомобиль по идентификатору, фильтровать автомобили по цвету или возвращать все автомобили, когда нет параматера.

В приведенном ниже коде получение одного объекта из массива работает, то есть когда я предоставляю идентификатор. Однако он не возвращает объекты, когда я возвращаю их внутри массива.

Я пытался распечатать запись массива до того, как он будет возвращен, но до сих пор не знаю, почему он не проходит через graphql.


schema.js файл внутри папки схемы
const graphql = require("graphql");
const { GraphQLObjectType, GraphQLString, GraphQLSchema } = graphql;

let cars = [
  { name: "Honda", color: "Red", id: "1" },
  { name: "Toyota", color: "Blue", id: "2" },
  { name: "BMW", color: "Blue", id: "3" }
];

const CarType = new GraphQLObjectType({
  name: "Car",
  fields: () => ({
    id: { type: GraphQLString },
    name: { type: GraphQLString },
    color: { type: GraphQLString }
  })
});

const RootQuery = new GraphQLObjectType({
  name: "RootQueryType",
  fields: {
    cars: {
      type: CarType,
      args: {
        id: { type: GraphQLString },
        color: { type: GraphQLString }
      },
      resolve(parent, args) {
        if (args.id) {
          return cars.find(car => (car.id = args.id));
        }
        if (args.color) {
          console.log(cars.filter(car => car.color === args.color));
          //Problem here
          return cars.filter(car => car.color === args.color);
        }

        console.log(cars);
        //And Problem Here
        return cars;
      }
    }
  }
});

module.exports = new GraphQLSchema({
  query: RootQuery
});



app.js файл
const express = require("express");
const graphqlHTTP = require("express-graphql");
const schema = require("./schema/schema");

const app = express();

app.use("/graphql", graphqlHTTP({ schema, graphiql: true }));

app.listen(4000, () => {
  console.log("Now listening for requests on port 4000");
});


Что я уже пробовал:

Как вы можете видеть, я попытался распечатать массив прямо перед его возвратом.

Самое смешное, что массив печатается, как и ожидалось, но на переднем конце graphql он не дает мне никакого результата.


Запрос GraphQL (фильтрация по цвету)

{
  cars(color:"blue") {
    name
  }
}



Запрос GraphQL (попытка получить список всех автомобилей)

{
  cars{
    name
  }
}


Что я получаю
{
  "data": {
    "cars": {
      "name": null
    }
  }
}

1 Ответов

Рейтинг:
1

Bohdan Stupak

Как насчёт

type: new GraphQLList(CarType)

а потом всегда разрешать свой результат в массиве?