如何在GraphQL模式中处理空值

时间:2018-11-10 14:35:11

标签: graphql apollo-server

我不断收到“无法为不可为空的字段Airline.id返回null”。当FlightSchedule.operatingAirline为null(根据架构完全有效)并且客户端查询FlightSchedule.operatingAirline.id时发生错误。如何解决这个问题?将Airline.id,Airline.code和Airline.name设置为可为空可解决此问题,但这不是解决此问题的正确方法,因为如果存在Airline,这3个字段也将始终存在。以下是我的架构:

type Airline {
    id: String!,
    code: String!,
    name: String!
}

type FlightSchedule {
    airline: Airline!
    operatingAirline: Airline
}

以下是我的查询:

  getFlightSchedules {
    airline
    {
      id
      code
      name
    }
    operatingAirline
    {
      id
      code
      name
    }
  }

1 个答案:

答案 0 :(得分:3)

在解决错误时,该字段将解析为null。其中包括您遇到的验证错误。根据规格:

  

如果在ExecuteSelectionSet()期间,具有非null fieldType的字段引发字段错误,那么该错误必须传播到整个选择集,如果允许则解析为null或进一步传播到父字段。

     

如果发生这种情况,则可以取消所有尚未执行或尚未产生值的同级字段,以避免不必要的工作。

换句话说,如果父字段具有特定的对象类型,则并且该类型具有不可为空的字段,并且将该字段解析为null,即父字段也将解析为null。父字段不能返回无效的对象(在这种情况下,因为它有一个非null字段返回null),所以它唯一可以做的就是返回null。当然,如果父字段本身非空,则此行为会沿树传播,直到最终遇到可为空的字段为止。

那么,为什么会出现该错误?因为您的@ExtendWith(SpringExtension.class) @SpringBootTest(classes = SecurityTestConfig.class) @AutoConfigureMockMvc @ActiveProfiles({"test", "test-security-profile"}) @TestInstance(Lifecycle.PER_CLASS) @Nested @DisplayName("Inner test") class InnerTest { @Test @Sql("/permission.sql") void temp() {//here @Sql throws exception} } 的解析器返回空值。它返回某种对象(不完整的航空公司对象,数组,字符串或其他东西),然后GraphQL有效地尝试将其强制转换为operatingAirline类型。请求了id字段,但是它根据Airline的解析器返回的对象解析为null。由于请求了operatingAirline并返回了null,因此整个id字段均未通过验证并返回null。