如何在GraphQL模式中处理null

Raj*_*ary 2 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
}
Run Code Online (Sandbox Code Playgroud)

以下是我的查询:

  getFlightSchedules {
    airline
    {
      id
      code
      name
    }
    operatingAirline
    {
      id
      code
      name
    }
  }
Run Code Online (Sandbox Code Playgroud)

Dan*_*den 5

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

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

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

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

那么,为什么会出现该错误?因为你的解析器的operatingAirline返回null。它返回某种对象(不完整的航空公司对象,数组,字符串或其他东西),然后GraphQL有效地尝试将其强制转换为该Airline类型。请求了id字段,但是它根据operatingAirline的resolver 返回的对象解析为null 。由于id请求并返回null,因此整个operatingAirline字段均无法通过验证,并返回null。