如何在GraphQL中返回对象数组,可能使用与返回单个对象相同的端点?

时间:2018-10-12 05:28:33

标签: javascript node.js graphql graphql-js express-graphql

我正在制作GraphQL API,在其中我可以通过其id检索汽车对象或在不提供任何参数的情况下检索所有汽车。

使用下面的代码,我可以通过提供id作为参数来成功检索单个汽车对象。

但是,在我期望有对象数组的情况下,即当我完全不提供任何参数时,在GraphiQL上将不会获得任何结果。

schema.js

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

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

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

测试查询及其相应结果:

查询1

{
  cars(id:"1"){
    name
  }
}

查询1响应(成功)

{
  "data": {
    "cars": {
      "name": "Honda"
    }
  }
}

查询2

{
  cars{
    name
  }
}

查询2响应(失败)

{
  "data": {
    "cars": {
      "name": null
    }
  }
}

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:4)

汽车和汽车清单实际上是两种不同的类型。一个字段不能一次解析为一个Car对象,而另一个解析为Car对象的数组。

您的查询返回的readOnly为空,因为您告诉它name字段可以解析为单个对象,但是可以解析为数组。结果,它正在数组对象上寻找一个名为cars的属性,由于不存在该属性,因此它返回null。

您可以通过几种不同的方式来处理。要将内容保留为一个查询,可以使用name而不是filter并将查询类型更改为列表。

find

或者,您可以将其分为两个单独的查询:

cars: {
  type: new GraphQLList(CarType), // note the change here
  args: {
    id: {
      type: GraphQLString
    },
  },
  resolve: (parent, args) => {
    if (args.id) {
      return cars.filter(car => car.id === args.id);
    }
    return cars;
  }
}

查看docs,以获取更多示例和选项。