Reactjs 查询空值返回graphql中的loading.load错误

Reactjs 查询空值返回graphql中的loading.load错误,reactjs,graphql,Reactjs,Graphql,我正在开发react应用程序。我要使用此查询: const Newss = gql` query getNewssData { newss(ordered: true) { id title content event{ id title } } } `; 由以下代码执行: <Query query={Newss}> {({ loading, error, dat

我正在开发react应用程序。我要使用此查询:

const Newss = gql`
  query getNewssData {
    newss(ordered: true) {
      id
      title
      content
      event{
        id
        title
      }
    }
  }
`;
由以下代码执行:

<Query query={Newss}>
  {({ loading, error, data }) => {
    if (loading) return LoadingNews();
    if (error) return `Error! ${error.message}`;
    return data.newss.map(news => newssToRender(news));
  }}
</Query>

{({加载,错误,数据})=>{
如果(加载)返回加载新闻();
if(error)返回`error!${error.message}`;
返回data.news.map(news=>newssToRender(news));
}}
但它返回错误!因为有一些没有事件的新闻。即使事件可能为空,如何允许有时执行此查询

非常感谢你的帮助

伊扎亚

注:

function newssToRender(news) {
  if (news.event === null) {
    return newssToRenderWithoutEvent(news);
  }
  return (
    <div>
      <News
        title={news.title}
        content={news.content}
        eventid={news.event.id}
        eventTitle={news.event.title}
        pictureSrc={news.picture}
      />
    </div>
  );
}
函数newssToRender(新闻){
如果(news.event==null){
返回NewsStoreUnderWithioutEvent(新闻);
}
返回(
);
}

该错误表示该字段为非空类型,这是GraphQL中包装另一类型的特殊类型。非null字段不能返回null,如果返回,将导致错误。这与一个字段声明一个
Int
,然后返回一个
String
——提供了错误的类型(无法强制),因此引发了一个错误没有什么区别

模式是服务器-客户机通信的契约。如果某个字段属于特定类型,服务器将有效地保证该字段始终为该类型。这限制了客户端的工作,因为它不需要在客户端对响应进行类型检查


不幸的是,您无能为力,因为这样的错误表示服务器端代码本身存在问题。如果事件有时为null是有意义的,那么该字段应该可以为null。否则,应该修复任何底层代码,以防止字段返回null。正确的做法是向API的作者提交一个bug(如果是你,也可以自己修复代码!)。

错误表明该字段是非空类型,这是GraphQL中包装另一种类型的特殊类型。非null字段不能返回null,如果返回,将导致错误。这与一个字段声明一个
Int
,然后返回一个
String
——提供了错误的类型(无法强制),因此引发了一个错误没有什么区别

模式是服务器-客户机通信的契约。如果某个字段属于特定类型,服务器将有效地保证该字段始终为该类型。这限制了客户端的工作,因为它不需要在客户端对响应进行类型检查


不幸的是,您无能为力,因为这样的错误表示服务器端代码本身存在问题。如果事件有时为null是有意义的,那么该字段应该可以为null。否则,应该修复任何底层代码,以防止字段返回null。正确的做法是向API作者提交一个bug(如果是你的话,也可以自己修复代码!)。

这确实是一个网关问题:

event: (root, args, context) => context.loaders.event.load(root.event)
替换为:

event: (root, args, context) => root.event ? context.loaders.event.load(root.event) : null,
允许空值


谢谢你,丹尼尔这确实是一个网关问题:

event: (root, args, context) => context.loaders.event.load(root.event)
替换为:

event: (root, args, context) => root.event ? context.loaders.event.load(root.event) : null,
允许空值


谢谢你,丹尼尔谢谢你的回答。我现在真的很清楚了。我原以为存在schema.gql问题,但实际上它来自网关加载程序。谢谢您的回答。我现在真的很清楚了。我认为存在schema.gql问题,但实际上它来自网关加载程序。